Ein Liner zur Berechnung der Gesamtgröße aller Nachrichten in maillog
Frage
Ok Jungs, die ich am Ende einer Sackgasse hier wirklich bin, wissen nicht, was sonst noch ...
, um zu versuchenIch 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:)
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