egrep特定段落从搜索字符串到源字符串之前

时间:2018-11-01 20:41:02

标签: regex perl awk sed

现在,我正在使用以下命令搜索3.297 GZIP存档日志文件:

zegrep -B 60 -E 'DMAStatus.*nError\ {13}.{3,5}\ $' collector_2018-*

我想实现的目标: 更换选件 -B 60 具有特定的搜索模式。

这意味着,现在我在每个搜索结果之前提取60行。但是,60行可能太少,但也太多。 (取决于在日志之前写入日志的内容,或者确切地说是多少行    'DMAStatus.*nError\ {13}.{3,5}\ $' 被记录)

顺便说一句,结束模式:'\ {13}.{3,5}\ $'只是我要在文件末尾查找的特定字符串。

\ {13} =查找13个空格字符

.{3,5} =查找3-5个字符长度内的任何字符串

\ $' =后跟一个以EOL $结尾的单个空格字符。

我知道每个错误消息都由一个特定的字符集调用:01TNL

如何运行zegrep命令来搜索上面给出的搜索模式,然后打印从01TNL开始的任何行到搜索模式?

我在这里添加了四个不同的日志文件的示例,它们在Notepad ++中一起复制到一个文件中。 不幸的是,我忘记添加一些关键信息。恐怕,这也是为什么使用awk的方法效果不佳的原因。

字符串01TNL在每个日志文件中出现几次。如果字符串始终为01TNL000,则没有错误,日志文件将继续增长。 除000之外的三倍以外的任何其他组合均被视为错误。 末尾没有错误的日志文件应被忽略,在任何其他情况下,所有日志文件信息均来自例如第01TNL020行到结束DMAStatus->nError行之间的所有内容都应打印。

############   Logfile 2018-10-16_10-23-25 started pid 88108  
10:23:53.987   FIO:  rcvd ".01TNL000"  
10:24:12.803   FIO:  rcvd ".01TNL000"  
10:24:30.934   FIO:  rcvd ".01TNL000"  
10:24:49.040   FIO:  rcvd ".01TNL0**2**0"  
10:24:49.702   DMSG: DMAStatus->nError             2329


############   Logfile 2018-10-17_20-35-08 started pid 187491  
20:36:47.838   FIO:  rcvd ".01TNL000"  
20:36:53.487   FIO:  rcvd ".01TNL000"  
20:36:58.418   FIO:  rcvd ".01TNL000"  
20:37:02.329   FIO:  rcvd ".01TNL000"  
21:24:51.060   FIO:  rcvd ".01TNL000"  
21:24:54.864   FIO:  rcvd ".01TNL000"  
21:24:58.773   FIO:  rcvd ".01TNL000"  
21:25:03.175   FIO:  rcvd ".01TNL000"  
21:25:03.340   DMSG: DMAStatus->nError             0 


############   Logfile 2018-10-15_18-45-08 started pid 42128  
18:46:49.656   FIO:  rcvd ".01TNL000"  
18:46:55.980   FIO:  rcvd ".01TNL000"  
18:47:01.407   FIO:  rcvd ".01TNL000"  
18:47:05.266   FIO:  rcvd ".01TNL000"  
18:47:09.130   FIO:  rcvd ".01TNL000"  
18:52:57.211   FIO:  rcvd ".01TNL000"  
18:53:01.146   FIO:  rcvd ".01TNL000"  
18:53:05.006   FIO:  rcvd ".01TNL000"  
18:53:09.611   FIO:  rcvd ".01TNL000"  
18:53:16.078   DMSG: DMAStatus->nError             0 


############   Logfile 2018-10-18_03-32-00 started pid 12504  
03:33:52.948   FIO:  rcvd ".01TNL000"  
03:33:55.429   FIO:  rcvd ".01TNL00**1**"  
03:34:01.823   DMSG: DMAStatus->nError             2288 

非常感谢。

1 个答案:

答案 0 :(得分:0)

Grep是错误的工具。 Awk会更合适。像这样:

zcat foo.gz | awk '/^01TNL/, /DMAStatus.*nError {13}.{3,5} $/ { print }'

编辑:more reading针对awk中的匹配范围。