我想获取已安装订阅的结束日期,并且当前正在使用
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,则将打印第二个字段。0
Product Name:
Server
1
Ends:
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