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

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

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

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;}'

おすすめ記事