Hallo, Am Die, 20 Nov 2007, Christian Salzer schrieb:
Am 20.11.07 schrieb David Haller <lists@dhaller.de>: [..]
Ansonsten ist deine Pipe-Konstruktion natürlich auch nicht gut. Und das 'cat' ist überflüssig.
Das rührte daher, das es ursprünglich eine von logrotate schon weggeräumte Datei war, und es eigentlich ein bzcat war, da aber auf der alten Maschine ein zcat war, habe ich es halt mit der ausgepackten Datei gemacht.
bzgrep ;) Aber das geht schon.
time grep 'Nov 18.*smtpd.*@sonst-eine-domain\.de' /data/mail-testlog \ | grep -v '5\.[17]\.1' > /dev/null
Da war wieder mein Problem mit diesen verdammten regex, die ich schon vor einiger Zeit mal unters Kopfkissen legen wollte...
OK, ist schneller, muss ich zugeben,
Alter 9.2er time grep 'Nov 18.*smtpd.*@sonst-eine-domain\.de' /data/mail-testlog | grep -v '5\.[17]\.1' > /dev/null
real 0m0.010s user 0m0.005s sys 0m0.005s
Das is ein bisserl wenig. Hast du das Ergebnis mal geprüft?
10.3er time grep 'Nov 18.*smtpd.*@sonst-eine-domain\.de' /data/mail-testlog | grep -v '5\.[17]\.1' > /dev/null
real 0m0.806s user 0m0.796s sys 0m0.016s
Hui. Das hat sich ja schon gelohnt ;)
Das war auch nur eine Beispielzeile...
Eigentlich ist das eher so ein Monstrum (eine Auswertung von ca. 20): /usr/bin/grep -i "@salzer-online." /var/log/mail|/usr/bin/grep -f /etc/greps/error_50x | /usr/bin/grep -i "`printf "%s %2d" $cs_datum_monat $cs_datum_tag`" | /usr/bin/cut -f 4 -d "<"| /usr/bin/cut -f 1 -d ">"| /usr/bin/sort| /usr/bin/uniq -c | /usr/bin/sort | /usr/bin/tail -n 20
Sowas ist ein Fall für awk oder perl. Was steht in /etc/greps/error_50x? Und ein paar (reale) Beispielzeilen wären gut.
BTW: Gibt es einen "einfacheren" Weg, das Postfix-Log nur nach dem aktuellen Datum zu durchsuchen? Ich habe am Anfang des Scriptes folgendes stehen: [..] cs_datum_tag=`/bin/date |/usr/bin/cut -f 3 -d " "` cs_datum_monat=`/bin/date |/usr/bin/cut -f 2 -d " "`
test -z "$cs_datum_tag" && cs_datum_tag=`/bin/date |/usr/bin/cut -f 4 -d " "`
RTFM hilft: man date / info date cs_datum_tag=`date '+%d'` cs_datum_monat=`date '+%m'` Oder gleich: ==== LANG=C awk ' BEGIN { FS="[<>]"; IGNORECASE=1; today = strftime("%b %d", systime()); re = today ".*smtpd.*@salzer-online\.de"; } $0 ~ re { adrs[$2]++; } END { for (a in adrs) { printf "%i %s\n", adrs[a], a; }; }' /var/log/mail | sort -n | tail -n 20 ==== Die Regex "re" beim awk muß noch verfeinert werden, v.a. um das, was bei dir in /etc/greps/error_50x steht... Das ganze Awk-Zeugs kannste auch in ein awk-script verpacken. Fragen? -dnh -- 102: Code Reuse (cat a.out_header; cat) > a.out (Enno Rehling) -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org