我一直在尝试想出一个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 匹配并且不以感叹号结尾,它标志着地址范围的开始。