Linux
如何grep在同一行中匹配的列?
我想獲取已安裝訂閱的結束日期,目前正在使用
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
。要僅限於單詞匹配,您可以改用它(假設您有gawk
GNU 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;}'