如何过滤掉以给定模式开头和结尾的多行?

时间:2016-11-05 00:21:44

标签: bash ubuntu awk sed grep

在我的公司,我们有一个带有java stacktraces的巨大日志文件。一般来说,其格式为:

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

感谢。

4 个答案:

答案 0 :(得分:3)

另一个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

答案 1 :(得分:2)

根据您的意见,您可以:

$ 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

正如评论中所指出的,你也可以这样做:

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

答案 2 :(得分: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的简写版本。

使用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 :(得分:0)

我认为

cat filename | grep useful

将起作用

相关问题