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

如何 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

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

这将设置一个标志relevant_section,以判断1以“Product Name:”开头的行(或者更确切地说,第二个空格分隔的标记是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;}'

答案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。要仅限于单词匹配,您可以使用它(假设您有gawk, GNU 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

相关内容