我有一个充满查询的日志文件,我只想查看有错误的查询。日志条目类似于:
path to file executing query
QUERY
SIZE: ...
ROWS: ...
MSG: ...
DURATION: ...
我想打印所有这些内容,但仅当MSG:
包含感兴趣的内容时(错误消息)。我现在所拥有的只是sed -n '/^path to file/,/^DURATION/'
,我不知道从哪里开始。
注意:查询通常是多行的,所以使用grep的-B
遗憾地不能一直工作(这是我到目前为止所做的,只是对-B
值很慷慨)
不知怎的,我只想使用sed
,但如果我绝对必须使用像awk
这样的其他东西,我猜这很好。
谢谢!
答案 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脚本