【问题标题】:How do I grep out multiple lines of the same pattern?如何grep出相同模式的多行?
【发布时间】:2016-08-18 03:03:06
【问题描述】:

我有一个日志文件,其中充满了对我无用的异常。

它每两秒生成一次,当查看包含 24 小时日志记录的日志文件时,我很难获得所需的相关信息。

我的日志看起来像这样:

2013-04-21 00:00:00,852 [service name] ERROR java-class - Exception 
  at java.net ......
  at java.apache ....
  and 28 more lines like these.

我想清理日志副本到另一个文件。

显然 grep -v "string" -A29 foo.log > new_file.log 并不能帮助我过滤掉这 30 行。

我还尝试了几个 sed 和 awk 语句,我看到了其他人遇到的类似问题。但它们似乎都没有帮助。

我更像是网络管理员,开始涉足 linux 系统。

有人可以帮忙吗?

【问题讨论】:

  • 我觉得寻找字符串可能不是正确的方法。 -A29 很好,但将正确的模式放在 grep 中,如“ERROR”。提供您需要提取的日志和部分,以便人们可以帮助您
  • 会根据2013-04-21 之类的日期查找帮助吗?
  • 这在 awk 中绝对是微不足道的,但是您需要告诉我们更多有关您的日志文件的信息才能获得正确的答案。我假设在尝试消除“重复”条目时不应该考虑时间戳,但是日志中是否有一些关键值可以用来消除重复项?这就是您想要做的所有事情,还是您正在寻找一个脚本来让您提取特定记录,如果是这样,基于什么?记录之间有空行吗?显示更多的输入记录和您想要的输出。

标签: linux sed awk grep


【解决方案1】:

这可能对你有用(GNU sed):

sed '/ERROR java-class - Exception/{:a;$!N;/\n\s*at\s.*/s///;ta;D}' file >new_file

这会将ERROR java-class - Exeption 之后以空格开头,然后是at ... 的所有行收集到一行,然后删除该行。使用上述作为模板,可以以相同的方式过滤其他异常。

【讨论】:

    【解决方案2】:

    我不确定是否有办法使用 grep 来实现,但使用 Perl 之类的东西可能更容易:

    perl -ne '$m = 0 if m/string/; print if $m++ > 29' foo.log > new_file.log
    

    (这里$m是自包含string的最后一行以来的行数。)

    【讨论】:

      【解决方案3】:

      使用 -A29 处理可能不适用于所有情况,因为有时异常跟踪可能在 ERROR 行之后的行数较少,或者可能更多,具体取决于异常。

      只需使用您提供的日志 sn-p,就可以使用 egrep 和 regex 删除整个异常跟踪。假设 log.txt 文件具有以下记录器语句(具有良好的行以及来自异常跟踪的行):

      A good line that should be captured - 1
      2013-04-21 00:00:00,852 [service name] ERROR java-class - Exception 
        at java.net ......
        at java.apache ....
      A good line that should be captured - 2
      2013-04-21 00:00:00,852 [service name] ERROR java-class - Exception 
        at java.net ......
        at java.apache ....
      A good line that should be captured - 3
      2013-04-21 00:00:00,852 [service name] ERROR java-class - Exception 
        at java.net ......
        at java.apache ....
      A good line that should be captured - 4
      2013-04-21 00:00:00,852 [service name] ERROR java-class - Exception 
        at java.net ......
        at java.apache ....
      A good line that should be captured - 5
      2013-04-21 00:00:00,852 [service name] ERROR java-class - Exception 
        at java.net ......
        at java.apache ....
      

      要仅检索不属于异常跟踪的行,请使用以下 egrep:

      egrep -vi "(error|(^\s+AT.*)|(^\s+?caused.*))" log.txt > /path/to/any/file
      

      i : 用于忽略正则表达式中的大小写。为了证明故意将 "error" 保留为小写,"AT" 保留为大写。

      (^\s+AT.) : 查找以空格开头,后跟 "at" 后跟的任何行任何字符。

      (^\s+?caused.) : 添加这个正则表达式组是因为有时有来自 Java 的嵌套堆栈跟踪,其第一行通常以 "Caused By ",然后是一些以 " 开头的堆栈跟踪行..."。虽然,它是可选的。

      这个 egrep 的输出

      A good line that should be captured - 1
      A good line that should be captured - 2
      A good line that should be captured - 3
      A good line that should be captured - 4
      A good line that should be captured - 5
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-25
        • 2016-09-15
        • 2011-02-10
        • 2017-03-15
        • 1970-01-01
        • 2018-01-08
        相关资源
        最近更新 更多