2016-11-11 60 views
1

我在日志文件中的错误是这样的:有没有办法从日志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 

但我可以怎么做,对于多日志消息?

回答

1

我发现这个解决方案:

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

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

  • (...)*查找多次
  • \n下一行
  • (?=\s)从空白字符开始
  • .*?,直到该行结束(注意在整个正则表达式$字符)
0

无意冒犯,但我觉得@尤金的解决方案过于通用的,因为这是一个日志文件,它也许可以该REG前比赛不需要的线。 所以,请确保我们确切的线,这是我认为应该是前例。欢迎评论!

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

并非所有的行都有日期。有些行的日期格式不同。 '\ s'也是通用的。获得更多信息比失去一些更好。 –