2014-10-10 92 views
1

b請注意,我有一個日誌文件「log1.txt」,其中包含由字符「|」分隔的字段。我想根據具體要求 檢索行,我有另外一個配置文件「code.conf」或者我把在現場5 發現這裏的值是日誌文件:根據條件從文件中提取信息

+++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++

abc|2| 11| 3| 1000| 13|scql| 0| | | 0| 0| plk| stv| 2| 0 

trc|2| 20| 3| 1200| 30|tkgl| 0| pajd|jahd| 0| 0| klm|fdkl|1|0 

klm|2| 0| 3| 1300| 19|mlpo| 0| | | 0| 0| qnhd| pkjs| 2| 0 

klm|2| 20| 3| 1600| 11|mlpo| 19| | | 0| 0| qnhd| pkjs| 2| 0 

++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++

這裏是配置文件「code.conf」

++++++++++++++++++++++++++++++++++++++++++++++++ +++++

1000 

1300 

1200 

1600 

++++++++++++++++++++++++++++++++++++++ +++++++++++++++

現在我想從日誌文件中檢索只是對應於這個條件的線路:

如果場2等於「2」,現場4等於「3」,字段5必須包含配置文件中聲明的值之一(字段3不等於「0」或「20」或)或字段8不等於「0」

我試過,但沒有正常工作:

awk -F' *\\| *' 'FNR==NR {a[$1];next} $2==2 && $4==3 && $5 in a && ($3!=0 || $3!=20)|| $8!=0 ' file 

輸出應該是:

abc|2| 11| 3| 1000| 13|scql| 0| | | 0| 0| plk| stv| 2| 0 

klm|2| 20| 3| 1600| 11|mlpo| 19| | | 0| 0| qnhd| pkjs| 2| 0 

我認爲錯誤來自於邏輯

謝謝

+0

如何是1600輸出時,它不是在'code.conf'? – anubhava 2014-10-10 11:30:51

+0

這只是一個錯誤,1600存在code.conf我會添加它 – mond14 2014-10-10 11:35:48

回答

0

你有在你的awk命令中混合使用了&&||。使用此:

awk -F' *\\| *' 'FNR==NR {a[$1];next} $2==2 && $4==3 && $5 in a && 
     (($3!=0 && $3!=20) || $8!=0)' code.conf file 
abc|2| 11| 3| 1000| 13|scql| 0| | | 0| 0| plk| stv| 2| 0 
klm|2| 20| 3| 1600| 11|mlpo| 19| | | 0| 0| qnhd| pkjs| 2| 0 
+0

,但在$ 3等於0或20的情況下,$ 8不等於0這是一個正確的情況 – mond14 2014-10-10 11:44:05

+0

所以你得到你的預期輸出aren'你呢? – anubhava 2014-10-10 11:46:24

+0

否,因爲如果字段3 $ 3等於0或20且字段$ 8不等於0,則該行必須存在於輸出中。 – mond14 2014-10-10 12:01:31

0

試試這個:

awk -F' *\\| *' 'FNR==NR {a[$1];next} ($2==2 && $4==3 && $5 in a &&$3 != 20) || $8 != 0)' code.conf test.txt 
+4

對於沒有經驗的用戶來說,難以解釋的代碼塊很難破譯,並且不會幫助人們理解解決方案。你能簡單地解釋一下它做了什麼,以及它如何解決這個問題? – anaximander 2014-10-10 12:15:08

+1

請解釋你的代碼! – 2014-10-10 12:16:25

+0

在awk中讀取條件,這就是區別。 – SMA 2014-10-10 12:17:34