同じ行で一致する列を見つける方法は?

同じ行で一致する列を見つける方法は?

インストールされた購読と現在使用されている購読の終了日を知りたいです。

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

単一タスクの場合awksedおよびを組み合わせることはほとんど必要ありません。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:」(またはスペースで区切られた2番目のトークン)で始まる行に文字列が含まれているかどうかを示す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毎回リセットしようとするので に設定し、行にも文字列があれば に設定します。その後、現在の行がで始まりゼロでない場合は、2番目のフィールドが印刷されます。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

関連情報