所以,我有以下日志样本:
2015-03-30 10:19:44,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] A log message 1
2015-03-30 10:19:45,250 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] A log message 2
2015-03-30 10:19:45,700 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] log message of exception occurred in
abc.cdef.class.sdk.SampleException: Message exception..
<stacktrace lines goes here>
2015-03-30 10:19:46,100 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] A log message 3
2015-03-30 10:19:46,120 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] A log message 4
2015-03-30 10:19:46,120 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d800e80-5276-4006-a44d-dd4cea7bcbe1 Info:P13 Code:AB4D] A log message 6
每个进入服务器的请求都是一个唯一的 IDA。我想 grep 所有具有特定 IDA 的日志行,并将找到的所有出现情况放入另一个日志文件中。我使用 grep 是因为它还会附加找到这些模式的文件和行号 ( grep –n )(搜索在 2 或 3 个文件上进行)。但是,我还希望包含堆栈跟踪异常,但这并没有发生,因为这些行没有我正在搜索的 IDA。
此外,堆栈跟踪异常也可能作为特定 IDA 的最后一个条目的一部分发生,如下所示:
2015-03-30 10:19:44,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] A log message 1
2015-03-30 10:19:45,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:BECD] A log message 2
2015-03-30 10:19:44,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:DFCD] A log message 3
2015-03-30 10:19:45,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:BBCD] A log message 4
2015-03-30 10:19:45,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCC] log message of exception occurred in
abc.cdef.class.sdk.SampleException: Message exception..
<stacktrace lines goes here>
2015-03-30 10:19:45,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:ed8ede83-1116-4697-a69d-ee6cd575cbe7 Info:P23 Code:ABDD] A log message 5
有什么建议来完成这个任务吗?
PS1-我一直在四处搜索,但我大多发现了标签之间的搜索,这对我来说还不够好。
PS2 — 我的解决方案操作系统目前只是一个单行 grep,但我愿意接受其他解决方案,例如 perl、awk、sed、python 或任何其他“bash 命令方式”。
答案1
Perl解决方案:
perl -ne '$id = "6d87de8e-1276-4496-b49d-dd4cd375cbe4";
print if $match = (/IDA:$id/ .. /IDA:(?!$id)/)
and $match !~ /E0$/
' *.log
解释:
/regex1/ .. /regex2/
对于匹配之间的行返回 true。IDA:(?!$id)
我和IDA:
没有关注通过 $id。- 范围中的最后一行由
E0
条件检查的后缀表示,因此不会打印最后一行(具有不同 IDA 的行)。
要包含文件名和行号,请使用
print "$ARGV:$.:$_"
并在结束报价前添加以下内容:
; $. = 0 if eof
答案2
这会将相应的数据(每个数据前面都有行号)打印到名为 IDA 的文件中:
awk 'match($0,/IDA:[^ ]+/) { print NR, $0 > substr($0,RSTART+4,RLENGTH-4) }' logfile
答案3
Sed
解决方案:
sed -n ':2;/IDA:6d87de8/{p;/exception/{:1;n;/IDA:/!{p;b1};b2}}'
该脚本抑制输出(-n
选项),直到满足适当的 IDA ( /IDA:6d87de8/
) 为止,该 IDA 将被打印 ( p
)。然后,pattern(line) 将检查是否存在“例外”,如果存在,则开始运行下一行 ( n
)。如果下一行不包含IDA:
该行,则将打印该行,并且脚本将转到下一行(从:1
点开始循环)。如果行 cosistIDA:
脚本从头开始(在:2
点处循环)
如果您想枚举行 - 通过nl
or输出行grep -n ".*"
并将其通过管道传输到sed
脚本。