awk:计算tomcat日志中的错误

时间:2012-07-18 10:47:07

标签: regex tomcat logging awk

我的Tomcat日志以这种格式构建:

[<DATE>] [<COMPONENT>] ERROR_TYPE <ERROR_NAME> - <Rest of line>

ERROR_TYPE DEBUG ERROR[18/Jul/2012:08:53:39 +0000] [component1] ERROR ConnectionTimeOut - ... [18/Jul/2012:09:54:32 +0000] [component2] DEBUG IPNotFound - ... [18/Jul/2012:09:54:32 +0000] [component1] TRACE Connected - ... [18/Jul/2012:08:53:39 +0000] [component1] ERROR ConnectionTimeOut - ...

如,

(ERROR_TYPE, ERROR_NAME)

我想创建一个从元组ERROR ConnectionTimeOut 2 DEBUG IPNotFound 1 TRACE Connected 1 到出现次数的映射,例如

_anything_ (ERROR|DEBUG|TRACE|WARN|FATAL_spaces_ _another_word_)_anything_

我如何匹配以下内容:

{{1}}
在AWK中

,只返回括号中的部分?

1 个答案:

答案 0 :(得分:3)

awk '/ERROR|DEBUG|TRACE|WARN|FATAL/ {count[$4,$5]++} END {for (i in count) {split(i, a, SUBSEP); print a[1], a[2], count[i]}}' inputfile

选择包含错误类型的行。一个count数组元素递增,类型和名称一起作为索引。逗号表示SUBSEP变量的内容,默认为\034。在END块中,迭代count数组,使用SUBSEP变量拆分索引。打印类型,名称和计数。

修改

这使用正则表达式来处理非结构化日志条目:

awk 'match($0, /(ERROR|DEBUG|TRACE|WARN|FATAL) +[^ ]+/) {s = substr($0, RSTART, RLENGTH); split(s, a); count[a[1],a[2]]++} END {for (i in count) {split(i, a, SUBSEP); print a[1], a[2], count[i]}}' inputfile