같은 행에서 일치하는 열을 찾는 방법은 무엇입니까?

같은 행에서 일치하는 열을 찾는 방법은 무엇입니까?

설치된 구독과 현재 사용 중인 구독의 종료 날짜를 알고 싶습니다.

subscription-manager list --installed | grep Ends | awk '{print $2 }')

구독이 여러 개인 경우 복잡성이 발생합니다. 이름에 "서버"가 포함된 구독과 일치하는 종료 날짜와 이름을 어떻게 얻을 수 있나요?

+-------------------------------------------+
    Installed Product Status
+-------------------------------------------+
Product Name:   Red Hat Enterprise Linux Server
Product ID:     69
Version:        7.7
Arch:           x86_64
Status:         Subscribed
Status Details:
Starts:         27/11/19
Ends:           27/11/20

Product Name:   Red Hat Enterprise Linux High Availability for x86_64
Product ID:     83
Version:        7.7
Arch:           x86_64
Status:         Subscribed
Status Details:
Starts:         27/11/19
Ends:           27/11/20

답변1

단일 작업의 경우 awk, sed및 를 결합하는 것이 거의 필요하지 않습니다. grep귀하의 경우에는 다음이 작동합니다.

subscription-manager list --installed | awk '$2=="Name:" && $0~/Server/ {relevant_section=1;print;} \
$1=="Ends:" && (relevant_section==1) {relevant_section=0;print;}'

그러면 "Product Name:"(또는 공백으로 구분된 두 번째 토큰 )으로 시작하는 줄에 문자열이 포함되어 있는지 relevant_section알려주는 플래그가 설정됩니다 . 이 줄은 편의상 인쇄되어 있습니다.1Name:Server

Ends:로 시작하는 행과 플래그가 인 경우 1해당 행을 인쇄하고 플래그를 로 재설정합니다 0.

종료 날짜만 인쇄하려면 다음과 같이 단축할 수 있습니다.

subscription-manager list --installed | awk '$2=="Name:" && $0~/Server/ {relevant_section=1;} \
$1=="Ends:" && (relevant_section==1) {relevant_section=0;print $2;}'

답변2

이것은 기본적으로 더 짧은 버전입니다.AdminBee 방법:

$ subscription-manager list --installed | 
    awk '{
            if(sub(/^Product Name: */,"")){
                a=0; 
                n=$0;
                if(/<Server>/){ a++ }
            } 
          }/Ends/ && a{print n,$2}'  
Red Hat Enterprise Linux Server 27/11/20

현재 줄이 로 시작하면 스크립트는 a매번 재설정하려고 하기 때문에 로 설정하고, 줄에도 문자열이 있으면 로 설정합니다. 그런 다음 현재 줄이 로 시작하고 0이 아닌 경우 두 번째 필드가 인쇄됩니다.0Product Name:Server1Ends:a

이는 Product Name:포함 notAServer또는 기타 포함된 콘텐츠 와도 일치합니다 Server. 일치하는 단어만 제한하려면 다음을 사용할 수 있습니다( gawkGNU awk가 있다고 가정 ).

subscription-manager list --installed | 
    gawk '{if(sub(/^Product Name: */,"")){a=0; n=$0;if(/\<Server\>/){a++}} }/Ends/ && a{print n,$2}'

답변3

사용밀러

$ tail -n +4 subscriptions | mlr --xtab --ips : --ops ': ' \
    filter '${Product Name} =~ "Server"' then cut -f 'Product Name,Ends'
Product Name:    Red Hat Enterprise Linux Server
Ends:            27/11/20

관련 정보