1

さて、私は本当にここで行き止まりになっています、他に何を試すべきかわかりません...

私はいくつかの電子メール統計のスクリプトを書いています。それがする必要があることの1つは、メールログ内のすべてのメッセージの完全なサイズを計算することです。これは私がこれまでに書いたものです。

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

そして、これが私のメールログからのサンプル行です:

Nov 15 09:08:48 HOSTNAME sendmail[3226]: oAF88gWb003226:  
from=<name.lastname@domain.com>, size=40992, class=0, nrcpts=24,  
msgid=<E08A679A54DA4913B25ADC48CC31DD7F@domain.com>, proto=ESMTP,  
daemon=MTA1, relay=[1.1.1.1]

だから私はそれを段階的に説明しようとします:

最初にファイルをgrepして、実際の「サイズ」を含むすべての行を見つけ、次に8番目のフィールド(この場合は「size = 40992」)を出力します。

次に、すべてのコンマ文字をプラス記号に置き換えます。

次に、数字とプラス記号を除くすべてを削除します。

次に、行の先頭を「(」に置き換え、最後の余分なプラス記号を「)」の後に「/1048576」に置き換えます。だから私はこのような巨大な表現を得る:

"(1 + 2 + 3 + 4 + 5 ... + n)/1048576"

個々のメッセージサイズをすべて合計して分割し、結果をMB単位で取得したいからです。

最後のawkコマンドは、10進数を取得するときです。精度はあまり気にしないので、小数点の前の部分を印刷するだけです。

問題は、これが機能しないことです...そして、ある時点で機能していたことを誓うことができました。私の表現が長すぎてbcが処理できないのでしょうか。

時間を割いて読んでくれてありがとう:)

4

2 に答える 2

4

awk1行のスクリプトでも機能すると思います。これは、egrepパターンが一致するすべての行に一致し、それらの行について、8番目のレコードを=記号で分割し、2番目の部分(数値)をSUM変数に追加します。ファイルのENDを確認すると、SUM / 1048576の値(またはメビバイト単位のバイト数)が出力されます。

awk '/ HOSTNAME sendmail\[.*.from=.*., size=/{ split($8,a,"=") ; SUM += a[2] } END { print SUM/1048576 }' maillog
于 2010-11-16T01:43:58.147 に答える
1
  • 式で発生するように、入力に改行がない場合、bcはチョークします。sed部分を次のように変更する必要があります。

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

  • 合計サイズが1MB未満で、bcが.03333334234のようなものを出力する場合、最後のawkはすべての出力を喜んで食べます。小数部に関心がない場合は、最後のawkコマンドと-lパラメーターをbcから削除します。

  • 私はこのワンライナーでそれをします:

grep'HOSTNAME sendmail [[0-9] [0-9] *]:.. *:。* from = .. *、size ='maillog | sed's |。*、size = \([0-9] [0-9] * \)、。* | \ 1 + |' | tr -d'\ n'| sed's | ^ |(|; s | $ | 0)/ 1048576 \ n |' | 紀元前

于 2010-11-16T01:23:56.597 に答える