藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 http://www.lslnet.com 2006年6月26日 11:18


請教一個查看qmail投遞記錄的shell腳本思路

請教一個查看qmail投遞記錄的shell思路
在log文件中查看fromer 發送給toer的郵件的投遞記錄,fromer和toer都是參數,一般的記錄格式如下:


@400000004393edec1d629734 new msg 83402
@400000004393edec1d630c64 info msg 83402: bytes 1116 from <***@tom.com> qp 13765 uid 8002
@400000004393edec1d635e6c starting delivery 109749: msg 83402 to local ***@****.***
@400000004393edec1d636254 status: local 1/60 remote 16/100
@400000004393edec2436512c delivery 109749: success: did_1+0+0/
@400000004393edec243825ec status: local 0/60 remote 16/100
@400000004393edec2438ed24 end msg 83402



但是這些記錄有時候不是連續在一起的,它們會被其他的記錄分開,請問一下怎麼可以提取出最重要的3行:
@400000004393edec1d630c64 info msg 83402: bytes 1116 from <***@tom.com> qp 13765 uid 8002
@400000004393edec1d635e6c starting delivery 109749: msg 83402 to local ***@****.***
@400000004393edec2436512c delivery 109749: success: did_1+0+0/




msg的NO。是不唯一的,
delivery 的NO.在一個文件中是唯一的,可以根據delivery 的NO.提取出最後的2行,請問一下怎麼提取出from的 那一行呢  

謝謝!


沒看懂 :(

想實現的功能:查看a發送給b的郵件的記錄
qmail的一般格式如下:
@400000004393edec1d629734 new msg 83402
@400000004393edec1d630c64 info msg 83402: bytes 1116 from a qp 13765 uid 8002
@400000004393edec1d635e6c starting delivery 109749: msg 83402 to local b
@400000004393edec1d636254 status: local 1/60 remote 16/100
@400000004393edec2436512c delivery 109749: success: did_1+0+0/
@400000004393edec243825ec status: local 0/60 remote 16/100
@400000004393edec2438ed24 end msg 83402

qmail收到一個郵件的時候,它會給這個郵件一個msg標記,如上面的msg 83402
qmail收到這個郵件後,它根據「to」,判斷出把這個郵件投遞給誰,它也會把這個投遞打上一個標記,如上面的delivery 109749

對於這個郵件的記錄中最有用的是下面的3句:
@400000004393edec1d630c64 info msg 83402: bytes 1116 from a qp 13765 uid 8002
@400000004393edec1d635e6c starting delivery 109749: msg 83402 to local b
@400000004393edec2436512c delivery 109749: success: did_1+0+0/

我想從完整的記錄中提取出上面的3句,
因為delivery標記在一個log文件中是唯一的,使用可以使用:
grep -i  'delivery 109749' logfile
來提取出後面的2句,
但是msg標記不是唯一的,當這個郵件投遞完了後,這個msg標記就會給後來的郵件使用,
想請問一下怎麼提取msg  from的那一句


謝謝!

猜一下吧 !
[code]
awk '/info msg/{n=NR;m=n+1;o=n+3}NR==n;NR==m;NR==o' log.txt
[/code]
BTW:還是沒看懂 :(

如果new msg到end msg是一個連續的塊,提出三句話不難吧?分別匹配特徵字串就行了吧?

謝謝!
new msg到end msg有時候不是一個連續的塊,在這之間有可能夾雜了其他郵件的記錄

用awk數組也不是問題吧?
[code]awk '/ starting delivery /{start[$6]=$0;a=$4;sub(/:/,"",a);i_start[$6]=a}
/ info msg /{a=$4;sub(/:/,"",a);infomsg[a]=$0}
/ delivery [0-9]+: success/{a=$3;sub(/:/,"",a);success[a]=$0}
END{for(i in infomsg){print infomsg[i];print start[i];print success[i_start[i]];
print "++++++"}}' file
[/code]



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com