2012-11-15 79 views
3

如果我在我的目標文件上執行這個grep,我會得到例如275。再現grep「我的模式」myfile.log |排序| uniq | wc -l in awk

但我想學習AWK所以嘗試這AWK:

awk 'BEGIN { count=0 } /my pattern/ { count++ } END { print count }' myfile.log 

而這種打印效果與預期的275。

所以越來越雄心勃勃我創建了一個awk腳本是這樣的:

BEGIN { 
    print "Log File Analysis"; 
    message=0; 
    events=0; 
} 

{ 
    /message/ { messages++; } 
    /event/ { events++; } 
} 
END { 
    print "messages:\t" messages; 
    print "events:\t" events; 
} 

我得到一個語法錯誤,

$ awk -f test_learn.awk test_log.log 
awk: test_learn.awk:16: /message/ { messages++; } 
awk: test_learn.awk:16:   ^syntax error 

我在做什麼錯?

我用awk從MinGW的外殼在Windows 7

+1

我想你已經有了一個額外的'''在那裏。因此'/ event/{events ++'}'應該是'/ event/{events ++; }' – Steve

+0

對不起,這是一個粘貼錯誤到SO –

回答

1

嘗試

awk 'BEGIN { count=0 }; /my pattern/{count++ }; END { print count }' myfile.log 

OR

awk 'BEGIN { count=0}; { if ($0 ~ /my pattern/) count++ }; END { print count };' myfile.log 

更重要的是,作爲變量默認初始化爲零,你不」 t需要BEGIN塊,所以

awk '/my pattern/{count++ }; END { print count };' myfile.log 

您可以將缺省循環應用於文件中的所有行,如使用if的二維示例,或者可以使用多個塊,按模式「過濾」,如上所述,以及編輯的添加。

當你做一行時,有些awk需要使用分號將主BEGIN和END塊從主循環塊中分離出來。

編輯

同樣的想法與你的第二個問題,並整合埃德莫頓的改進措施(感謝)

/message/ { messages++ } 
/event/ { events++ } 

END { 
print "Log File Analysis" 
print "messages:\t" messages 
    print "events:\t" events 
} 

IHTH

+0

哦。我以爲你必須在代碼塊周圍。但看起來你可以在'代碼塊' –

+0

中使用'if(var〜/ pat /){...}'或多個模式匹配塊在代碼塊(除BEGIN/ENDs之外)中有多個{}。實際上你可以同時擁有兩個,但是模式匹配塊不能在默認塊{{}}內。祝你好運。 – shellter

+0

請注意,您不需要將數字awk變量初始化爲零,awk爲您執行此操作,並且因爲awk語句在行尾處結束,所以不需要/希望所有後綴分號。此外,將第一個打印移動到END塊的開頭,並且根本不需要BEGIN塊。 –