【问题标题】:Grep ignore multiple linesgrep 忽略多行
【发布时间】:2010-12-02 06:36:48
【问题描述】:

Grep 有没有办法使用 -v 开关来忽略一行和它之后的下一行。它基本上是从日志文件中过滤异常,即

Valid log entry 1
Exception exceptionname
    at a.b.c
    at d.e.f
    ...
Valid log entry 2

grep 生成:

Valid log entry 1
Valid log entry 2

我试过grep -v Exception -A 2

但这不起作用。

任何想法都将不胜感激。

【问题讨论】:

  • -v 不反转 -A,只是匹配
  • 有了这个简单的例子,用 grep 寻找你想要的东西比消除你不想要的东西似乎更容易:grep Valid

标签: shell grep


【解决方案1】:

对 glenn jackman 的改进,通过管道一些命令,您可以获得之前/之后的行为:

awk -v nlines_after=5 '/EXCEPTION/ {for (i=0; i<nlines_after; i++) {getline};print "EXCEPTION" ;next} 1' filename.txt|\
tac|\
awk -v nlines_before=1 '/EXCEPTION/ {for (i=0; i<nlines_before; i++) {getline}; next} 1'|\
tac

【讨论】:

    【解决方案2】:
    sed -n '/^Exception/,+2!p' 文件名

    【讨论】:

    【解决方案3】:

    试试 awk:

    awk -v nlines=2 '/^Exception/ {for (i=0; i<nlines; i++) {getline}; next} 1'
    

    【讨论】:

      【解决方案4】:

      在您的情况下,您可以告诉grep 也忽略任何包含前导空格的行:

      grep -v 'Exception|^\s'
      

      【讨论】:

        猜你喜欢
        • 2010-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-21
        • 1970-01-01
        • 2015-02-05
        相关资源
        最近更新 更多