如何使用动态列grep输出日志

时间:2015-11-29 02:48:51

标签: regex linux awk sed grep

日志文件:

2015-11-29 02:24:14,053 DEBUG ExcludePostalCodesServiceImpl [messageListenerContainer-38] :88 - Postal Code : 5118 is Excluded for country : AU
2015-11-29 02:24:14,077  INFO BatchExecutionListener [messageListenerContainer-35] :29 - ----------FINISH JOB: shipmentJob, JOB_INSTANCE_ID: 121453924, EXIT_CODE: COMPLETED----------
2015-11-29 02:24:14,054  INFO ShipmentRuleRunnerImpl [messageListenerContainer-38] :83 - Shipment is not selected due to exclusion postal code: [awb=40738xxxxx, shp_acct_no=7612xxxxx, rcvr_name=xxxxx, rcvr_org=CAROLxxx, org_ctry=US, dest_ctry=AU, dest_addr=xxxxxxxx,

说上面的文件太大了。我想:

1)grep -B 3“由于排除邮政编码”xxxx.log,未选择发货   - 这是grep我需要的关键字,并在

之前返回3行

2)我想在这个示例中过滤掉包含[messageListenerContainer-38]的行,以便输出如下所示。请注意,[messageListenerContainer-35]缺失,因为我只想要与第一个关键字grep相关联的那个。

2015-11-29 02:24:14,053 DEBUG ExcludePostalCodesServiceImpl [messageListenerContainer-38] :88 - Postal Code : 5118 is Excluded for country : AU
2015-11-29 02:24:14,054  INFO ShipmentRuleRunnerImpl [messageListenerContainer-38] :83 - Shipment is not selected due to exclusion postal code: [awb=40738xxxxx, shp_acct_no=7612xxxxx, rcvr_name=xxxxx, rcvr_org=CAROLxxx, org_ctry=US, dest_ctry=AU, dest_addr=xxxxxxxx,

grep -B 3 "Shipment is not selected due to exclusion postal code" xxx.log | grep [messageListenerContainer-38]

如果标记始终是唯一的,则

有效,但如果我要从大量日志中返回grep(返回多个结果),则xx [messageListenerContainer-xx]中的数字是动态的。

它也会在一段时间后重复使用,因此我必须将grep -B限制为5才能在相关之前仅使用一定量的行。 (原木的性质)

因此,是否可以在某个关键字之前插入几行然后再进行过滤以仅使用与第一个grep相关联的[messageListenerContainer-xx]?

2 个答案:

答案 0 :(得分:1)

这可能适合你(GNU sed):

sed -r ':a;$!N;s/[^\n]+/&/3;$!Ta;/\n[^\n]*Shipment bla bla [^\n]*$/!D;:b;/^[^\n]*(messageListenerContainer -[0-9]+ ).*\n[^\n]*\1[^\n]*$/P;s/^[^\n]*\n//;tb' file

解决方案分为两部分。首先选择n行(在本例中为3)的滚动窗口,并且最后一个(或首先取决于您的视图)窗口行与所需的字符串匹配(在本例中为Shipment bla bla)。确定模式空间中的线符合所需标准后,使用模式匹配比较第一行和最后一行,看它们是否符合第二个标准,即messageListenerContainer - ...。如果是这样,则打印第一行并且无条件删除。重复此过程,直到处理完所有行,然后打印最后一行。

答案 1 :(得分:1)

awk救援!

我认为你正在寻找类似的东西。

$ awk -v n=4      '{p=p%n;a[p++]=$0} 
   /search_pattern/{key=$5; 
                    for(i=p;i<p+n;i++) 
                      {line=a[i%n]; 
                       if(line ~ key) print line}}' log    

X X X X X-38 XXXX
X X X X X-38 XXXX
X X X X X-38 search_pattern

其中

$ cat log
X X X X X-35 XXXX
X X X X X-35 XXXX
X X X X X-35 XXXX
X X X X X-38 XXXX
X X X X X-35 XXXX
X X X X X-38 XXXX
X X X X X-38 search_pattern
X X X X XXXX XXX
搜索模式的

回顾n行,并打印与密钥($ 5)字段相关的行。要获得完全匹配,您可以使用相等~更改正则表达式匹配==