2008-10-01 122 views
2

我目前正在編寫一個簡單的.sh腳本來解析匹配「o」的字符串的Exim日誌文件。目前,在查看output.txt時,每行(606行)上都印有0。我猜我的邏輯是錯誤的,因爲awk不會引發任何錯誤。awk腳本幫助 - 邏輯問題

這是我的代碼(更新了連接和計數器問題)。編輯:我已經從dmckee的回答中採用了一些新代碼,我現在正在使用舊代碼,以支持簡單性。

awk '/o'\''/ { 
     line = "> "; 
     for(i = 20; i <= 33; i++) { 
      line = line " " $i; 
     } 
     print line; 
    }' /var/log/exim/main.log > output.txt 

任何想法?因爲'是電子郵件地址中的一個非法字符(並且在我們的數據庫中,只出現o'-prefixed名稱),所以我在電子郵件地址中查找「o」。

編輯2:按照評論的要求,這裏是一些期望輸出的消毒樣本:

[xxx.xxx.xxx.xxx] kathleen.o'[email protected] <kathleen.o'[email protected]> routing defer (-51): retry time not reached 

[xxx.xxx.xxx.xxx] julie.o'[email protected] <julie.o'[email protected]> routing defer (-51): retry time not reached 

[xxx.xxx.xxx.xxx] james.o'[email protected] <james.o'[email protected]> routing defer (-51): retry time not reached 

[xxx.xxx.xxx.xxx] daniel_o'[email protected] <aniel_o'[email protected]> routing defer (-51): retry time not reached 

我開始在我的套環20的原因是因爲20場之前,一切都只是標準記錄我的用途不需要的信息。我所需要的只是IP解決方案以及其他解決方案的全部內容(對於每個使用的郵件服務器,每個550錯誤的消息都不同,我正在編寫一個常用列表)

+0

您是否有原始日誌文件中的單行? – 2008-10-01 20:00:26

+0

我必須審查它(敏感數據那裏),但這裏是一個: 2008-09-28 04:50:43 1KisKj-0000tX-L0 == james.o'[email protected] 路由延遲(-51):未達到重試時間 – junkforce 2008-10-01 20:07:29

回答

2

這裏沒有真正需要grep。讓AWK選擇匹配行對你(和修復您的拼接錯誤按ΤΖΩΤΖΙΟΥ):

awk '/o'\''/ { 
      line = "> "; 
      for(i = 20; i <= 33; i++) { 
       line = line " " $i; 
      } 
      print line; 
     }' /var/log/exim/main.log > output.txt 

當然,你最終需要一些奇怪的,如果你在像上面的promp做逃逸。這是一個腳本清潔...


編輯:在第一遍我錯過了+ =問題...

而且假設你在上面給該行的部分,因爲它只有13個字段(默認字段以空格分隔)。

3

+意味着數字在AWK。如果要連接,只需放置用空格分隔的常量和/或表達式。

所以,這

line += " " + $i 

應該成爲

line = line " " $i 

編輯:IFF進出口日誌文件(我比較Postfix的進:)通過一個單一的空間是分開的,是不是以下更簡單:

grep -F o\' /var/log/exim/main.log | cut -d\ -f20-33 >output.txt 

1

「'」在本地部分不是非法的。從RFC2821,第4.1節。2:

Local-part = Dot-string/Quoted-string 

Dot-string = Atom *("." Atom) 

Atom = 1*atext 

2821進一步引用RFC2822非本地定義的元素,所以:

atext   =  ALPHA/DIGIT/; Any character except controls, 
         "!"/"#"/ ; SP, and specials. 
         "$"/"%"/ ; Used for atoms 
         "&"/"'"/
         "*"/"+"/
         "-"/"/"/
         "="/"?"/
         "^"/"_"/
         "`"/"{"/
         "|"/"}"/
         "~" 

換言之, 「'」 是一個完全合法的無引號characted有在電子郵件中的localpart。現在,它可能不合法在您的網站,但這不是你說的。

對不起,不直接主題,但我想糾正你的斷言。

1

關閉任務,更簡單:python。

import fileinput 
for line in fileinput.input(): 
    if "'" in line: 
     fields = line.split(' ') 
     print "> ", ' '.join(fields[20:34])