2012-07-18 37 views
1

我的Tomcat的日誌建立在這種格式計數錯誤:AWK:tomcat中日誌

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

哪裏ERROR_TYPEa log4j valueDEBUGERROR

例如,

[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_ 
在AWK

,並在括號中只返回一部分?

回答

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 
+0

日誌經常無,所以我不能用這樣的表達式'$ 4'。無論前後發生什麼,我只想匹配兩個字。 – 2012-07-18 10:55:57

+0

'split'函數應該是'split(i,a,SUBSEP)'來獲取索引,而不是值。 – Birei 2012-07-18 11:04:35

+0

@Birei:謝謝。 – 2012-07-18 11:09:07