【问题标题】:How do I filter out multiple lines which starts and ends with a given pattern?如何过滤出以给定模式开头和结尾的多行?
【发布时间】:2023-03-13 15:29:01
【问题描述】:

在我的公司,我们有一个带有 java 堆栈跟踪的巨大日志文件。一般来说,它的格式是:

useful line 1
useful line 2
useful line 3
MARKER1 start of exception
... <--Around 100 lines here
end of exception MARKER2
useful line 4
useful line 5
useful line 6
MARKER1 start of exception
... <--Around 100 lines here
end of exception MARKER2
useful line 7

它包含有用的信息和无用的异常。

是否可以结合使用awk/sed/grep..从日志中过滤掉所有无用异常的内容?

在上面的示例中,输出将是:

useful line 1
useful line 2
useful line 3
useful line 4
useful line 5
useful line 6
useful line 7

谢谢。

【问题讨论】:

标签: bash ubuntu awk sed grep


【解决方案1】:

另一个带有锚定模式的sed

$ sed '/^MARKER1/,/MARKER2$/d' file

useful line 1
useful line 2
useful line 3
useful line 4
useful line 5
useful line 6
useful line 7

或翻译成awk

$ awk '/^MARKER1/,/MARKER2$/{next} 1' file

【讨论】:

    【解决方案2】:

    使用 awk

    排除异常的开始和结束以及介于两者之间的所有内容:

    $ awk '/start of exception/,/end of exception/{next} 1' file
    useful line 1
    useful line 2
    useful line 3
    useful line 4
    useful line 5
    useful line 6
    useful line 7
    

    它是如何工作的:

    • /start of exception/,/end of exception/{next}

      对于从异常开始到结束范围内的任何行,我们跳过其余命令并从 next 行重新开始。

    • 1

      对于任何其他行,我们打印它们。 1 是 awk 对 print-the-line 的简写。

    使用 sed

    $ sed '/start of exception/,/end of exception/d' file
    useful line 1
    useful line 2
    useful line 3
    useful line 4
    useful line 5
    useful line 6
    useful line 7
    

    它是如何工作的:

    • /start of exception/,/end of exception/d

      对于从异常开始到结束范围内的任何行,我们删除该行 (d)。

    默认情况下,打印所有其他行。

    【讨论】:

      【解决方案3】:

      根据您的意见,您可以:

      $ awk 'BEGIN{ flag=1 } /MARKER/ {flag=!flag; next} flag' file
      useful line 1
      useful line 2
      useful line 3
      useful line 4
      useful line 5
      useful line 6
      useful line 7
      

      正如 cmets 中指出的,你也可以这样做:

      awk '/MARKER/{f=!f;next} !f' file
      

      【讨论】:

      • awk '/MARKER/{f=!f;next} !f'可能会更短
      【解决方案4】:

      我觉得

      cat filename | grep useful
      

      会起作用

      【讨论】:

      • grep useful filename 将适用于给定的示例。实际的日志文件可能有其他文本,例如以每个有用行的时间戳开头。在这种情况下,当这些行有用时,您可以将命令更改为 grep "^2" logfilegrep -E " ERROR| WARN| INFO" logfile
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 2011-08-12
      • 1970-01-01
      • 2018-03-19
      • 2019-04-26
      • 1970-01-01
      相关资源
      最近更新 更多