Linux

如何grep在同一行中匹配的列?

  • May 5, 2020

我想獲取已安裝訂閱的結束日期,目前正在使用

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

這基本上是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,它將列印第二個欄位。0``Product Name:``Server``1``Ends:``a

請注意,這也將匹配包含 的 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}'

請注意,很少需要為單個任務組合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;}'

relevant_section如果以1“產品名稱:”開頭的行(或者更確切地說,第二個空格分隔的標記所在的位置Name:)包含字元串,這將設置一個標誌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;}'

引用自:https://unix.stackexchange.com/questions/584445