使用 sed 挑选出潜在的多行日志条目

使用 sed 挑选出潜在的多行日志条目

我一直在尝试想出一个sed命令来从我们的应用程序服务器日志中挑选出单个日志条目。

日志采用以下格式:

LOG|2016-07-26_15:37:45:536|entry1|!
LOG|2016-07-26_15:37:45:536|entry2|extra data
on new line|!
LOG|2016-07-26_15:37:45:536|entry3|!
LOG|2016-07-26_15:37:45:536|entry4|!
LOG|2016-07-26_15:37:45:536|entry5|!

正如您所看到的,有些条目只有一行,有些条目有多行,其中包含额外的数据。条目始终以日志类型开头(简化为上面的“LOG”)并始终以|!

现在这就是我到目前为止所拥有的:

sed -n -e '/'$id'/,/|!/ p'

这对于多行日志条目效果很好:

$ cat log | sed -n -e '/entry2/,/|!/ p'
LOG|2016-07-26_15:37:45:536|entry2|extra data
on new line|!

但对于单行条目来说不太好,因为它也会显示下一个条目:

$ cat log | sed -n -e '/entry3/,/|!/ p'
LOG|2016-07-26_15:37:45:536|entry3|!
LOG|2016-07-26_15:37:45:536|entry4|!

关于如何修改sed上面的内容以涵盖单行和多行日志条目,有什么想法吗?

答案1

其他方法可以是循环匹配的行直到条目结束:

sed '/entry3|/{:a;/!$/!{n;ba;};p;};d' log

答案2

您需要单独处理这些情况,例如:

sed -n '/entry3.*[^!]$/, /|!/p; /entry3.*!/p ' log

如果一行与 id 匹配以感叹号结尾,它将被打印。如果一行与 id 匹配并且不以感叹号结尾,它标志着地址范围的开始。

相关内容