使用sed和regex进行多行日志文件处理

时间:2012-09-12 10:15:51

标签: regex sed awk logparser log-analysis

我有一个如下所示的日志文件:

11-Sep-2012 00:00:00 clojure.contrib.logging$fn__43$impl_write_BANG___51 invoke
INFO: creditAcc(args=[1506112834429596390 7080851004 4500])
11-Sep-2012 00:00:00 clojure.contrib.logging$fn__43$impl_write_BANG___51 invoke
INFO: callProf|tupsCredit|180|[1506112834429596390 7080851004 45]
11-Sep-2012 00:00:00 clojure.contrib.logging$fn__43$impl_write_BANG___51 invoke
INFO: creditAcc(args=[1506112834429596390 7080851004 4500]) -> done.
11-Sep-2012 00:00:00 clojure.contrib.logging$fn__43$impl_write_BANG___51 invoke
INFO: return(1506112834429596390,0)

日志文件中的每个条目都跨越两行,因此每个条目都以时间戳开头。我已经设法使用sed替换第一行末尾的换行符,但问题是日志条目中间的某处是java stacktrace消息。当sed通过堆栈跟踪时,它会反转条目的顺序,它们以INFO或ERROR等开头,时间戳显示为第二行。因此,我正在寻找一种解决方案,强制sed将时间戳识别为使用正则表达式的第一行[类似^ \ d {2}],然后在同一行中,用空格替换换行符然后将值分解为用于分析的列。 stacktrace消息以空格[^ \ s]开头,因此它们易于识别和跳过。

使用sed或awk解决此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

sed '/^ /d; N; s/\n/ /' inputfile

这匹配以空格开头的行并删除它们。 d指令跳过其余指令。如果一行没有以空格开头,那么也会读入下一行,并将它们之间的换行符更改为空格。

只有日志行成对才能正常工作。换句话说,如果堆栈跟踪行跟随时间戳行,并且在堆栈跟踪之后出现INFO / ERROR行,则它将无法正常工作。