有没有办法从日志中grep这个多行部分?

时间:2016-11-11 08:46:39

标签: 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" > apache.error.log-NS

但是我怎么能为多行日志消息做到这一点?

2 个答案:

答案 0 :(得分:1)

我找到了这个解决方案:

cat apache.error.log | grep -Pzo '^.*?Wide character.*?\nStack.*?(\n(?=\s).*?)*$'

(\n(?=\s).*?)*表示:

  • (...)*多次查找
  • \n下一行
  • (?=\s)以空白字符开头
  • .*?直到该行的结尾(在整个正则表达式中注意$个字符)

答案 1 :(得分:0)

没有冒犯,但我认为@Eugen的解决方案过于通用,因为这是一个日志文件,可能,reg ex也匹配不需要的行。 所以,确保我们获取确切的行,这是我认为应该是reg ex。随意评论!

^\[\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).*?)*$