我的日志文件包含以下内容:
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
我可以编写一个正则表达式来检索带有“最后一条消息重复...”语句的行,但是,如果不检索它前面的行,该行就毫无意义。
话虽这么说,有谁知道正则表达式可以让我在检测到“最后一条消息重复...”语句时检索这两行?
编辑为 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
我会这样做。尝试搜索包含两组的模式。第一组是一行,后面跟着另一组,其中包含另一行“最后一条消息重复”文本。那么第一组的内容就是你要找的文字了
类似这样的东西(这是过于简化的正则表达式):
\n(.*)\n(.*)last message repeated
现在第一个组值包含您感兴趣的行。
它必须是正则表达式吗? grep 允许您在匹配之前和之后获取上下文(
-B NUM
和 -A NUM
选项)
模式 ^.*$ 匹配整行。 翻译:行首,后跟任意数量的字符,最后是行尾。 因此,也许您可以搜索“任意行,然后是”(您那里的模式)。
对旧帖子的回复较晚,但它可能会帮助其他人寻找类似的东西。
与 David 的建议类似,以下内容允许您将输出限制为仅前一行。
^(.*)\n(.*)last message repeated