2015-06-02 29 views
0

我試圖用awk拉查詢查詢之間的區別:已完成ASSIGNEDUNASSIGNED已審查導讀ASSIGNED,並錯誤從日誌文件中的每一行。最終的結果看起來一些接近:有類似的話在他們

COMPLETED 
COMPLETED 
UNASSIGNED 
REVIEWED 
ERROR 
... 

不過,我得到一些問題,詞/詞組混合了對方,特別是與回顧ASSIGNED。這是採取我的任何陳述,應該是評審分配,只是讓他們ASSIGNED。我的AWK語句是:

awk '{for(i=1;i<=NF;i++){if($i~/^(REVIEWED|COMPLETED|REVIEW ASSIGNED|ASSIGNED|UNASSIGNED|ERROR)$/){print $i}}}' myFile 

我試圖尋找它,但我不熟悉AWK以及如何處理包含多個單詞考慮到它是分開的表情也沒有發現什麼特別在白色空間。

+2

究竟是什麼問題?有些行不匹配嗎?輸出不是您想要的格式嗎?你能告訴我們樣本輸入和你想從輸入中得到的輸出嗎? –

+0

當然,我編輯了一下帖子。 REVIEW ASSIGNED正在被轉換爲ASSIGNED,並且由於它之間的空白空間,我很難保留前面陳述的完整性。 – Dumpcats

+0

啊。我懂了。應答。 –

回答

2

您正在循環並匹配字段的字段,但空格分隔awk中的字段(默認情況下),因此行中的字段將不會是REVIEW ASSIGNED

因此,而不是匹配REVIEW ASSIGNED像你想這條線相匹配的ASSIGNED測試。

停止循環領域,只是用這樣的:

awk 'match($0, /(REVIEWED|COMPLETED|REVIEW ASSIGNED|ASSIGNED|UNASSIGNED|ERROR)/, a) {print a[0]}' myFile 

埃德莫頓指出的match這種用法是呆子特定的(因爲它增加了對第三組參數match)。不使用該功能的一個版本是這樣的

awk 'match($0, /(REVIEWED|COMPLETED|REVIEW ASSIGNED|ASSIGNED|UNASSIGNED|ERROR)/) {print substr($0, RSTART, RLENGTH)}' myFile 

旁白:

我覺得埃德莫頓指出,這個正則表達式不會匹配UNASSIGNED正確的ASSIGNED將始終與第一但是它會看起來awk的正則表達式引擎沒有這個問題。對於一個引擎,但是,反轉訂單可能會解決這個問題。

awk 'match($0, /(REVIEWED|COMPLETED|REVIEW ASSIGNED|UNASSIGNED|ASSIGNED|ERROR)/, a) {print a[0]}' myFile 
+0

請注意,'ASSIGNED'不必要的冗餘,因爲它包含在'REVIEW ASSIGNED'和'UNASSIGNED'中。 – ghoti

+0

沒有模式錨是真的。如果我更瞭解輸入文件格式,我可能會試圖包含適當的錨,這可能導致它不完全冗餘。對於包含全套有效選項(冗餘或不冗餘)的自我記錄性質,還有一些可以說的(取決於環境)。 –

+2

匹配的字符串每行只能出現一次嗎?正則表達式術語的順序是否重要(例如,如果'UNASSIGNED'存在於一條線上,它會被找到還是'ASSIGNED'匹配)?你應該提到這是由於match()的第三個參數引起的特定於gawk。 –

相關問題