2017-02-15 61 views
1

我在本地中使用Postfix。我正在編寫一個腳本來獲取延遲/退回的郵件報告,用於每天。如果我是正確的,通常是日誌在日誌文件中以列的形式打印。獲取Postfix/var/log/maillog中的特定列

我的建議是我希望grep前一天的「to」,「status」,「said」和它的消息例如「說:550 Invalid Recipient」。而事情是相同的日誌打印多次,但我需要grep從所有類似的日誌中的任何一個。

Feb 13 13:40:35 ganga11 postfix/smtp [12098]:3371F2BF52:to =,relay = none,delay = 1.2,delay = 0.84/0.01/0.27/0.07,dsn = 5.1.1,status =反彈(主機說:550 5.1.1收件人未找到http://x.co/irbounce(回覆RCPT TO命令))

Feb 13 13:40:35 ganga11 postfix/smtp [6923]:3371F2BF52:to =,relay = none ,延遲= 1.5,延遲= 0.84/0/0.46/0.19,dsn = 5.0.0,狀態=反彈(主機表示:550沒有這樣的用戶([email protected](回覆RCPT TO命令))

Feb 13 13:40:35 ganga11 postfix/smtp [29489]:3371F2BF52:to =,relay = none,delay = 1.3,delay = 0.84/0.01/0.38/0.1,dsn = 5.0.0,status = bounced(host說:550#5.1.0地址被拒絕回覆RCPT TO命令))

Feb 13 08:14:45 ganga11 postfix/smtp [6736]:F093B2BCA3:to =,relay = none,delay = 6139,delay = 6139/0.02/0.15/0,dsn = 4.4.1,status = deferred(連接到aaaaaa.co.in連接被拒絕)

Feb 13 13:40:36 ganga11 postfix/smtp [6940]:3371F2BF52:to =,relay = none,delay = 2.3 ,延遲= 0.84/0.01/0.17/1.3,dsn = 5.1.1,狀態=反彈(主機表示:550)5.1.1未找到收件人。 http://x.co/irbounce(回覆RCPT TO命令))

Feb 13 13:40:35 ganga11 postfix/smtp [6923]:3371F2BF52:to =,relay = none,delay = 1.5,delay = 0.84/0/0.46/0.23,dsn = 5.0.0,status = bounced(主機表示:550沒有這樣的用戶([email protected])(回覆RCPT TO命令))

Feb 13 04:14:24 ganga11 postfix/smtp [6736]:F093B2BCA3:to =,relay = none,delay = 6139,延遲= 6139/0.02/0.15/0,dsn = 4.4.1,status = deferred(連接xyzz.com連接被拒絕)

Feb 13 17:14:11 ganga11 postfix/smtp [6736]:F093B2BCA3:to =,relay = none,delay = 6139,delay = 6139/0.02/0.15/0,dsn = 4.4.1,status = deferred(連接到bbbbb .com連接被拒絕)

+0

嗨kometen, 我試過用sed,awk和grep,但是我找不到合適的命令。 這是一個似乎有點但取回所有日誌。 awk -F,'{print $ 7 $ 12}'/home/samplelog.txt | awk -F \ f = 14 -vt = 25'{for(i = 14; i <= t; i ++)printf(「%s%s」,$ i,(i == t)?「\ n」: OFS)}'| sort | uniq – Narasimman

+0

我建議你使用grep來獲得你想要的行,並用管道將其剪切以提取帶有-f參數的列並使用空格作爲分隔符。某處像'grep'foo | bar | baz「|剪下-d「」-f 1,2,3'。 http://serverfault.com/是一個更好的地方要問。 – kometen

回答

1

這裏有些東西可以幫助你。

cat mail.log | grep "postfix/smtp" | grep -P 'status=(?!sent)' | 
sed "s/^.*: \(.\+\):.* to=<\(.\+\)>.* status=\([^ ]\+\) (\(.*\))$/[\1] <\2> \3: \4/" | 
sort | uniq 

grep "postfix/smtp"過濾SMTP相關消息。

grep -P "status=(?\!sent)"過濾具有除之外的狀態的郵件

sed ...提取隊列ID收件人地址狀態和remainings作爲狀態消息

sort | uniq過濾重複條目。

+0

嗨喬,謝謝你的答案。但順便說一句,當我執行命令時,我得到了這個。請你糾正它,我錯過了什麼? cat /home/samplelog.txt | grep「postfix/smtp」| grep -P「status =(?\!sent)」| sed「s /^.*:\(。\ + \):。* to = <\(.\+\)>。* status = \([^] \ + \)(\(。* \))$/[\ 1] <\2> \ 3:\ 4 /「|排序| uniq grep:在(?或(? - – Narasimman

+0

)之後無法識別的字符看起來像是在反斜槓上窒息了。是否將第二個grep更改爲'grep -P'status =(?! sent)'help?'或'grep -E'status =(反彈)「'? – Joe

+0

Ahhhhh Man !!!它像老闆一樣工作!!!非常感謝Joe :)今天你節省了我的頭 – Narasimman