grep 特定 id 请求的日志行

grep 特定 id 请求的日志行

所以,我有以下日志样本:

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点处循环)

如果您想枚举行 - 通过nlor输出行grep -n ".*"并将其通过管道传输到sed脚本。

相关内容