我正在寻找一个单行正则表达式来匹配日志文件中的单词"错误",我需要获取具有单词"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}