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

Regex 如何使用动态列grep日志输出,regex,linux,awk,sed,grep,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 - ----------F

日志文件:

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-b3“由于排除邮政编码”xxx.log而未选择装运”| grep[messageListenerContainer-38]

如果标记始终是唯一的,则可以使用,但是如果我要从大量日志列表中搜索(返回多个结果),则xx[messageListenerContainer xx]中的数字是动态的

它也将在一段时间后重新使用,因此我必须将grep-B限制为5,在这之前只允许grep一定数量的行。(原木的性质)

因此,是否可以在某个关键字前grep几行,然后再进行进一步筛选,只获取与第一个grep相关联的[messageListenerContainer xx]行?

这可能适合您(GNU-sed):


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

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

对于搜索的模式,请返回
n
行,并打印与键($5)字段相关的行。对于精确匹配,您可以使用等式更改regex match
~
=

您所说的“动态”到底是什么意思?你在说什么“线程”?根据您的描述,我猜不出输出应该是什么样子。您是否可以包含两个不同输入的样本,并为每个输入样本提供适当的输出?另外,您的首选解决方案是否特定于Linux?(想知道标签。)Hi ghoti,这将是动态的(后面的数字):messageListenerContainer-38数字35表示线程。它将被反复使用,因此它不是唯一的。因此,我需要首先grep出一个模式。由于在我想要grep的模式上面的行上需要一些信息,所以我需要在前面包括几行。但是,前面的几行也会在其他线程(例如messageListenerContainer-42)中发送消息。我如何过滤我的输出,使之只成为我想要的?(基于上面第一个grep的模式)您的输出应该是什么样子的?“几个”是多少?您需要在搜索字符串之前始终保留该线程消息的行吗?是否有一个日志行指示线程上活动的开始?那么一行表示线程上活动的结束呢?请编辑您的问题并澄清。评论应该是评论,而不是澄清您需求的关键信息。哦,到目前为止你都做了些什么?你说的是想在关键字前做5行,但你只显示了3行示例输入。如果您希望我们编写自己的示例输入和输出文件,以便我们可以开始帮助您,您可能会感到惊讶……我真希望您在示例输入/输出方面不要这么节俭。您谈论的是第一个grep输出,但您的输入仅包含一行与grep regexp匹配的代码,因此idk,如果您谈论的是忽略与该regexp匹配的后续代码行,或者从第一个grep中选择某个id XX并使用它从文件或其他内容中的后续代码行中选择代码行。你的问题在awk中解决起来绝对是微不足道的,只要你能清理并强化你的问题,清楚地告诉我们问题是什么。很好。一点也不神秘。我不知道人们在说什么,塞德很漂亮-P
$ 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