当图案在范围内时,使用sed打印范围?

时间:2011-03-17 15:22:35

标签: linux command-line sed

我有一个充满查询的日志文件,我只想查看有错误的查询。日志条目类似于:

path to file executing query
QUERY
SIZE: ...
ROWS: ...
MSG: ...
DURATION: ...

我想打印所有这些内容,但仅当MSG:包含感兴趣的内容时(错误消息)。我现在所拥有的只是sed -n '/^path to file/,/^DURATION/',我不知道从哪里开始。

注意:查询通常是多行的,所以使用grep的-B遗憾地不能一直工作(这是我到目前为止所做的,只是对-B值很慷慨)

不知怎的,我只想使用sed,但如果我绝对必须使用像awk这样的其他东西,我猜这很好。

谢谢!

3 个答案:

答案 0 :(得分:4)

您还没有说出错误消息是什么样的,所以我假设它包含“错误”一词:

sed -n '/^MSG.*ERROR/{H;g;N;p;};/^DURATION/{s/.*//;h;d;};H' < logname

(我希望有更简洁的方法来清除保留空间。任何人?......)

答案 1 :(得分:1)

我可以建议使用grep的解决方案。如果日志文件中的结构总是与上面相同(即MSG在第5行,后面跟着一行),那将会有效:

egrep -i '^MSG:.*error' -A 1 -B 4 logfile

这意味着:如果单词error出现在MSG行中,则输出从MSG之前的4行开始直到其后一行的块。 当然,您必须调整正则表达式以识别错误。

如果这些块的结构不同,这将不起作用。

答案 2 :(得分:0)

也许您可以使用cgrep.sed书籍

所述的Unix Power Tools脚本