Frage

Ok Jungs, die ich am Ende einer Sackgasse hier wirklich bin, wissen nicht, was sonst noch ...

, um zu versuchen

Ich bin ein Skript für einige E-Mail-Statistiken zu schreiben, ist eines der Dinge braucht, es zu tun ist, um die vollständige Größe aller Nachrichten in der maillog zu berechnen, das ist, was ich bisher geschrieben:

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

Und hier ist eine Probenleitung von meinem maillog:

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]

Also ich werde versuchen, es Schritt für Schritt zu erklären:

Zuerst habe ich grep durch die Datei alle Zeilen zu finden, die tatsächliche „Größe“ enthält, neben ich das achte Feld drucken, in diesem Fall „size = 40992“.

Als nächstes ersetze ich alle die Kommazeichen mit einem Pluszeichen.

Dann habe ich löschen alles außer den Ziffern und das Pluszeichen.

Dann ersetze ich den Anfang der Zeile mit einem „(“ und ich ersetzen die letzte zusätzlichen Pluszeichen mit a „)“, gefolgt von „/ 1048576“. Also habe ich einen großen Ausdruck erhalten wie folgt aussehen:

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

Weil ich will alle, die einzelnen Nachrichtengrößen addieren und sie zu teilen, damit ich das Ergebnis in MB bekommen.

Der letzte awk Befehl ist, wenn ich eine Dezimalzahl bekomme ich wirklich nicht für Präzision kümmern, so dass ich nur den Teil vor dem Komma drucken.

Das Problem ist, das nicht funktioniert ... Und ich könnte schwören, es war an einem Punkt arbeiten, könnte es mein Ausdruck sein ist zu lang für bc Griff?

Danke, wenn Sie die Zeit lesen durch:)

War es hilfreich?

Lösung

Ich denke, eine einzeilige awk Skript arbeiten. Sie paßt zu jeder Linie, dass Ihr egrep Muster übereinstimmt, dann für die Zeilen es den achten Eintrag, der von dem = -Zeichen teilt und fügt den zweiten Teil (die Anzahl) die Summe variabel. Wenn es das Ende der Datei sieht druckt er den Wert von SUM / 1048576 (oder die Byte-Zählung in Mibibytes).

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

Andere Tipps

  • bc würgt, wenn kein Newline in seinem Eingang ist, geschieht wie mit Ihrem Ausdruck. Sie müssen den sed Teil ändern:

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

  • Der letzte awk wird alle Ihre Ausgabe gerne essen, wenn die Gesamtgröße kleiner als 1 MB und bc gibt so etwas wie ,03333334234. Wenn Sie im Dezimalsystem Teil zu entfernen, die letzte awk-Befehl und dem Parameter -l von bc nicht interessiert.

  • Ich würde es tun, mit diesem Einzeiler:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top