用于匹配错误和关联几行的正则表达式

Regular expression to match error and associated few lines

本文关键字:几行 正则表达式 错误 关联 用于      更新时间:2023-09-26

我正在寻找一个单行正则表达式来匹配日志文件中的单词"错误",我需要获取具有单词"Error"的行上方和下方的几行以进行调试。

例如: 我需要匹配单词"TypeError",并在此匹配的行上方和下方获取其他几行。至少我需要接下来的 10 行。任何人都可以帮忙吗?

下面的日志文件内容 =>

**TypeError**: Parameter 'url' must be a string, not undefined
    at Url.parse (url.js:107:11)
    at urlParse (url.js:101:5)
    at Object.urlResolve [as resolve] (url.js:404:10)
    at parseMarkdown (/opt/controllers/api/userguide.js:53:19)
    at /opt/controllers/api/userguide.js:33:17
    at Object.<anonymous> (/opt/models/api.js:172:4)
    at /opt/lib/data/api.js:138:5
    at IncomingMessage.<anonymous> (/opt/node_modules/httpunch/lib/_wrap_request.js:100:9)
    at IncomingMessage.g (events.js:180:16)
    at IncomingMessage.emit (events.js:117:20)

试试这个(最多获取 10 个前后行)-

(?:(?:.*'n){0,10}).*?Error.*(?:(?:'n.*){0,10})

演示

编辑
只需阅读有关Unix环境的评论。您可以使用与上面相同的正则表达式使用 Grep 命令.
像这样 -

$ grep -Pzo "(?:(?:.*'n){0,10}).*?Error.*(?:(?:'n.*){0,10})" <filename>

这个答案的所有功劳都归功于 Kamehameha,它基于他的正则表达式,但我继续前进,并附上解释,使其更简单一些。虽然它不像原版那么完美,但效果很好。

充分表达

('n.*){0,10}(.*Error:.*)('n.*){0,10}

在正则表达式上查看

匹配误差线本身

.*Error:.*

这条线其实很简单。您唯一需要知道的是.*匹配任意数量的字符(但不是换行符)。所以这一行的意思是"查找任何内容,后跟"错误:",后跟任何内容"

匹配任何行

'n.*

这也很容易理解:'(换行符)后跟任何内容。

最多匹配 10 行

('n.*){0,10}

这采用"全行"正则表达式并在 0 到 10 次之间应用它,尽可能多(因为正则表达式默认是贪婪的)。

将一切整合在一起

我们想要的是"10 行 + 错误线 + 10 行",所以我们只是把我们之前所做的,放在一个大的陈述中。

('n.*){0,10}(.*Error:.*)('n.*){0,10}