Regex 有没有办法从日志中grep这个多行部分?
我在日志文件中有如下错误:Regex 有没有办法从日志中grep这个多行部分?,regex,grep,Regex,Grep,我在日志文件中有如下错误: [11:16:16 31/10] 2428 ERROR: Wide character in subroutine entry at /home/site/site/app/lib/SC/Contro ller/Client/Sites.pm line 1584. Stack: [/xxx:1584] [/xxx:70] [/xxx:133] 我想将此错误放入一些文件,如: cat apache.error.log | grep "query NS" &
[11:16:16 31/10] 2428 ERROR: Wide character in subroutine entry at /home/site/site/app/lib/SC/Contro
ller/Client/Sites.pm line 1584.
Stack:
[/xxx:1584]
[/xxx:70]
[/xxx:133]
我想将此错误放入一些文件,如:
cat apache.error.log | grep "query NS" > apache.error.log-NS
但我如何才能为多行日志消息做到这一点呢?我找到了以下解决方案:
cat apache.error.log | grep -Pzo '^.*?Wide character.*?\nStack.*?(\n(?=\s).*?)*$'
其中,(\n(?=\s)。*?)*
表示:
查找多次(…)*
下一行\n
从空白字符开始(?=\s)
直到该行结束(注意整个正则表达式中的*?
字符)$
^\[\d{2}\:\d{2}\:\d{2}\s\d{2}\/\d{2}\]\s\d+\sERROR\:\sWide\scharacter\sin\ssubroutine\sentry\sat\s[a-zA-Z\/\.]+\s.*?\nStack.*?(\n(?=\s).*?)*$
并非所有行都有日期。有些行的日期格式不同<代码>\s也是通用的。与其失去一些信息,不如得到更多的信息。