用于检索日志文件中上一行的正则表达式

时间:2009-03-12 18:07:20

标签: regex

我的日志文件包含以下内容:

2009-03-12T12:44:27+0000 something was logged
2009-03-12T12:45:36+0000 127.0.0.1 127.0.0.1 <auth.info> last message repeated 2 times

我可以编写一个正则表达式来检索带有“last message repeated ...”语句的行,但是,如果没有检索到它之前的行,该行也没有意义。

话虽如此,有没有人知道一个正则表达式,只要检测到“last message repeated ...”语句,我就可以检索这两行?

4 个答案:

答案 0 :(得分:2)

编辑为2组匹配正则表达式。你可以试一试:RegexLib

少了优化但是这个:

([\r\n].*?)(?:=?\r|\n)(.*?(?:last message repeated).*)

应该努力从这样的结果中获得结果:

2009-03-12T12:44:27+0000 something1 was logged
2009-03-12T12:44:27+0000 something2 was logged
2009-03-12T12:45:36+0000 127.0.0.1 127.0.0.1 <auth.info> last message repeated 2 times
2009-03-12T12:44:27+0000 something3 was logged
2009-03-12T12:44:27+0000 something4 was logged
2009-03-12T12:44:27+0000 something5 was logged
2009-03-12T12:45:36+0000 127.0.0.1 127.0.0.1 <auth.info> last message repeated 2 times

导致:

Matches
First Match, First Group: 2009-03-12T12:44:27+0000 something2 was logged
First Match, Second Group: 2009-03-12T12:45:36+0000 127.0.0.1 127.0.0.1 <auth.info> last message repeated 2 times
Second Match, First Group: 2009-03-12T12:44:27+0000 something5 was logged 
Second Match, Second Group: 2009-03-12T12:45:36+0000 127.0.0.1 127.0.0.1 <auth.info> last message repeated 2 times

答案 1 :(得分:1)

它必须是正则表达式吗? grep允许您在匹配前后获取上下文(-B NUM-A NUM选项)

答案 2 :(得分:0)

我会这样做。尝试搜索包含两个组的模式。第一组是一行,后面是另一个包含另一行“最后重复消息”文本的组。然后第一组的内容是您要查找的文本。

像这样(这是过度简化的正则表达式):

\n(.*)\n(.*)last message repeated

现在,第一个组值包含您感兴趣的行。

答案 3 :(得分:0)

模式^。* $匹配整行。翻译:Start Of Line,后跟任意数量的字符,然后是End Of Line。所以也许你可以搜索“任何一行,然后是”(你在那里的模式)。