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

问题描述 投票:0回答:5

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

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

我可以编写一个正则表达式来检索带有“最后一条消息重复...”语句的行,但是,如果不检索它前面的行,该行就毫无意义。

话虽这么说,有谁知道正则表达式可以让我在检测到“最后一条消息重复...”语句时检索这两行?

regex
5个回答
4
投票

编辑为 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

3
投票

我会这样做。尝试搜索包含两组的模式。第一组是一行,后面跟着另一组,其中包含另一行“最后一条消息重复”文本。那么第一组的内容就是你要找的文字了

类似这样的东西(这是过于简化的正则表达式):

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

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


1
投票

它必须是正则表达式吗? grep 允许您在匹配之前和之后获取上下文(

-B NUM
-A NUM
选项)


0
投票

模式 ^.*$ 匹配整行。 翻译:行首,后跟任意数量的字符,最后是行尾。 因此,也许您可以搜索“任意行,然后是”(您那里的模式)。


0
投票

对旧帖子的回复较晚,但它可能会帮助其他人寻找类似的东西。

与 David 的建议类似,以下内容允许您将输出限制为仅前一行。

^(.*)\n(.*)last message repeated
© www.soinside.com 2019 - 2024. All rights reserved.