我的日志文件包含以下内容:
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 ...”语句,我就可以检索这两行?
答案 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。所以也许你可以搜索“任何一行,然后是”(你在那里的模式)。