Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 有没有办法从日志中grep这个多行部分?_Regex_Grep - Fatal编程技术网

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)
    从空白字符开始
  • *?
    直到该行结束(注意整个正则表达式中的
    $
    字符)

恕我冒犯,但我认为@Eugen的解决方案太通用了,因为这是一个日志文件,所以有可能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).*?)*$

并非所有行都有日期。有些行的日期格式不同<代码>\s也是通用的。与其失去一些信息,不如得到更多的信息。