基于条件的 AWK 打印特定列

3

我有一个grep的文本:

$ bppllist -allpolicies -l | egrep  'INFO|CLASS '
CLASS DEV_DC1_MSSQL_Daily *NULL* 0 760000 0 *NULL*
INFO 15 0 0 3590 *NULL* 0 0 2147483647 0 0 0 0 0 0 0 0 0 0 1359375508 D2135AE2694411E293B100C0DD0FD650 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 3 0 93 0 0 0 0 0 0 1
CLASS DEV_DC1_MSSQL_Daily_TL *NULL* 0 760000 0 *NULL*
INFO 15 0 0 3590 *NULL* 0 0 2147483647 0 0 0 0 0 0 0 0 0 0 1359375508 538E4964610F11E5B3CB00C0DD0FD650 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 3 0 50 0 0 0 0 0 0 1
CLASS DEV_DC1_MSSQL_Monthly *NULL* 0 760000 0 *NULL*
INFO 15 0 0 3590 *NULL* 0 0 2147483647 0 0 0 0 0 0 0 0 0 0 1359375508 53B1F616610F11E5A02E00C0DD0FD650 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 3 0 58 0 0 0 0 0 0 1

如果可能的话,我希望你能够在一行命令中使用awk来获取CLASS行的第二列和INFO行的第12列。

我所处的系统是

我尝试过以下方式:

bppllist -allpolicies -l | egrep  'INFO|CLASS ' | awk '($1 == "CLASS ") && ($2 == "INFO") { print $2 $12}'

但我认为这只是一种条件反射,而不是双重过滤。
此外,有没有办法以这种格式获取它们?
DEV_DC1_MSSQL_Daily 0
DEV_DC1_MSSQL_Daily_TL 0
DEV_DC1_MSSQL_Monthly 0
1个回答

4

只需这样说:

$ awk '$1=="CLASS" {print $2} $1=="INFO" {print $12}' file
DEV_DC1_MSSQL_Daily
0
DEV_DC1_MSSQL_Daily_TL
0
DEV_DC1_MSSQL_Monthly
0

顺便提一下,你之前的 egrep "INFO|CLASS " 可能也是不必要的。
为了产生紧凑的输出,只需在找到“CLASS”时捕获其值,并在“INFO”时打印即可。
$ awk '$1=="CLASS" {c=$2} $1=="INFO" {print c, $12}' file
DEV_DC1_MSSQL_Daily 0
DEV_DC1_MSSQL_Daily_TL 0
DEV_DC1_MSSQL_Monthly 0

1
该死,我刚开始就犯了这个错误...不知道我哪里出错了,于是开始测试新代码。谢谢你啊。 - Xao
有没有可能像这样设置它们: DEV_DC1_MSSQL_Daily 0 DEV_DC1_MSSQL_Daily_TL 0 DEV_DC1_MSSQL_Monthly 0 - Xao
@user3034160,请更新您的原始问题,因为在评论中无法区分文件应该如何显示。 - fedorqui
1
@user3034160,你可以这样说:例如,如果在一个“CLASS”后总是有一个“INFO”,则可以使用awk '$1=="CLASS" {c=$2} $1=="INFO" {print c, $12}' file - fedorqui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接