2010-11-16 93 views
1

玉傢伙我在一個死衚衕我真的在這裏,不知道還有什麼嘗試...Oneliner計算所有消息的完整大小的maillog

我寫一個腳本一些電子郵件統計,它需要做的是計算在maillog中的所有消息的完整大小的一件事,這是我寫到目前爲止:

egrep ' HOSTNAME sendmail\[.*.from=.*., size=' maillog | awk '{print $8}' | 
tr "," "+" | tr -cd '[:digit:][=+=]' | sed 's/^/(/;s/+$/)\/1048576/' | 
bc -ql | awk -F "." '{print $1}' 

這裏是從我的maillog採樣線:

Nov 15 09:08:48 HOSTNAME sendmail[3226]: oAF88gWb003226: 
from=<[email protected]>, size=40992, class=0, nrcpts=24, 
msgid=<[email protected]>, proto=ESMTP, 
daemon=MTA1, relay=[1.1.1.1] 

所以我會ry逐步解釋:

首先,我通過文件grep找到包含實際「大小」的所有行,然後打印第8個字段,在本例中爲「size = 40992」。

接下來我用加號替換所有的逗號字符。

然後我刪除除數字和加號之外的所有內容。

然後,我用「(」替換了行的開頭,並用「)」替換了最後一個額外的加號,後面加上了「/ 1048576」。所以我得到了巨大的表情看起來像這樣:

「(1 + 2 + 3 + 4 + 5 ... + N)/ 1048576」

因爲我想加起來所有的個人信息和大小將其分開,以MB爲單位得出結果。

最後的awk命令是當我得到一個十進制數時,我真的不在乎精度,所以我只是在小數點前打印部分。

問題是,這是行不通的......我可以發誓它一直在工作,這可能是我的表情太長了bc處理?如果

感謝您花時間通讀:)

回答

4

我認爲一行awk腳本也可以。它匹配與你的egrep模式匹配的任何行,然後對於這些行,它用=符號分割第八條記錄,並將第二部分(數字)添加到SUM變量。當它看到文件的結尾時,它打印出SUM/1048576的值(或Mibibytes中的字節數)。

awk '/ HOSTNAME sendmail\[.*.from=.*., size=/{ split($8,a,"=") ; SUM += a[2] } END { print SUM/1048576 }' maillog 
+0

哇,非常感謝你,這是一個很好的方法,它的工作速度非常快!正是我在尋找:) – f10bit 2010-11-16 01:49:09

+0

+1它也快得多。我之前用grep/sed/tr/bc的東西的唯一原因是因爲它更接近問題中的一行 – thkala 2010-11-16 01:51:59

1
  • BC扼流圈如果在其輸入端沒有換行,與你的表達情況。你必須在SED部分更改爲:

的sed 's/^ /(/秒/ + $ /)\/1048576 \ n /'

  • 最後awk將吃得開心所有的輸出,如果總大小小於1MB和BC輸出類似.03333334234。如果您對小數部分不感興趣,請從bc中刪除最後一條awk命令和-l參數。

  • 我想這一個班輪做到這一點:

的grep'HOSTNAME sendmail的[[0-9] [0-9] *]:.. *:*從=。 。*,size ='maillog | sed's |。*,size = \([0-9] [0-9] * \),。* | \ 1+ |' | tr -d'\ n'| sed's |^|(|; s | $ | 0)/ 1048576 \ n |' | bc

+0

感謝您這麼快速和詳細的答案! 嗯,似乎它不僅在換行符,按照你的建議添加它,仍然會得到「(standard_in)1:解析錯誤」。 試過你的代碼,不幸的是它不起作用我得到一個: 「sed:-e表達式#1,字符31:無效的參考\ 1在's'命令的RHS上」 – f10bit 2010-11-16 01:36:23

+0

@ f10bit抱歉,StackOverflow吃了幾個字符在這裏和那裏,請再試一次 – thkala 2010-11-16 01:43:12

+0

@ f10bit:在原始命令後添加一個\ n在1048576之後好像在這裏正常工作 – thkala 2010-11-16 01:47:51