der.fred
Goto Top

Script zur Logauswertung

Hallo, liebe Profi-Scripter face-wink
Ich muß eine Logdatei auswerten und schaffe es einfach nicht, die benötigte Auswertung zu erstellen, obwohl eigentlich alle Infos vorhanden sind. Hoffentlich kann mir jemand helfen...

Das Ganze sollte unter Linux als Script laufen - entweder Bash, AWK oder Perl. Ich versuche mich jetzt schon den zweiten Tag daran - erfolglos! face-sad
Besten Dank schon mal immer im Voraus!
Gruß
Fred

Folgendes Problem:
ich habe eine Datei, welche in etwa die folgende Struktur hat:

XXX uninteressante Zeile
XXX connected to IP xxx.xxx.xxx.xxx
XXX uninteressante Zeile
XXX RCPT TO  Empfaenger@adresse.de
XXX uninteressante Zeile
XXX uninteressante Zeile
XXX MAIL FROM  Empfaenger@adresse.de
XXX uninteressante Zeile
XXX uninteressante Zeile
XXX RCPT TO  Empfaenger@adresse.de
XXX uninteressante Zeile
XXX MAIL FROM  Empfaenger@adresse.de
XXX uninteressante Zeile
XXX Mail rejected: reason
XXX uninteressante Zeile
XXX RCPT TO  Empfaenger@adresse.de
XXX uninteressante Zeile
XXX MAIL FROM  Empfaenger@adresse.de
XXX RCPT TO  Empfaenger@adresse.de
XXX uninteressante Zeile
XXX MAIL FROM  Empfaenger@adresse.de
XXX Mail rejected: reason
XXX connected to IP xxx.xxx.xxx.xxx
XXX uninteressante Zeile
XXX RCPT TO  Empfaenger@adresse.de
XXX MAIL FROM  Empfaenger@adresse.de
XXX Mail rejected: reason

Die Datei ist zeitchronologisch aufgebaut. Wenn beispielsweise kein Eintrag "rejected" kommt, bedeuted das, dass die Mail, deren Parameter darüber stehen, zugestellt wurde.
Wenn keine IP Adresse steht, gilt die letzte gelesene, da keine neue Verbindung aufgebaut wurde. Ich möchte jetzt alle Mails, welche abgewiesen wurden in einer Tabelle.
Also in der folgenden Form etwa, wobei in diesem Fall hier die Tabelle nur 3 Einträge mit 2 unterschiedl. IPs hätte.

IP-Adresse      To      From    Reason
--------------------------------------

Content-Key: 147049

Url: https://administrator.de/contentid/147049

Ausgedruckt am: 28.03.2024 um 15:03 Uhr

Mitglied: 77559
77559 16.07.2010 um 23:09:06 Uhr
Goto Top
Hallo Fred,

ohne das genaue Format des Zeitstempels wird man dir kaum helfen können,
XXX ist nicht sehr hilfreich.

Eine Reduzierung auf relevante Zeilen könntest du schon einmal hiermit erreichen:
grep '\(connected to IP\)\|\(RCPT.TO\)\|\(MAIL FROM\)\|\(Mail rejected:\)' <test.log

Gruß
LotPings
Mitglied: der.Fred
der.Fred 18.07.2010 um 22:27:57 Uhr
Goto Top
Hallo LotPings,

ich hab mich vielleicht ein bissel dumm ausgedrückt. Eine Zeile im Log sieht in Wirklichkeit natürlich wesentlich komplizierter aus. Den gewünschten Inhalt aus der relevanten Zeile zu extrahieren, krieg ich bestimmt auf die Reihe. Mein Problem ist vielmehr, eine Routine zu schreiben, welche überhaupt erstmal alle die zu einem für mich relevanten Datensatz (als nur die "rejected" Mails mit Absender, IP vom MTA, Empfänger, Grund) zusammengehörigen Zeilen ermittelt.

Also ungefähr so:
1.) das Log nach dem ersten Eintrag "connected to IP" suchen.
2.) diese Zeile merken
3.) die nächste Zeile, die ein RCPT TO enthält, merken
4.) die nächste Zeile, die ein MAIL FROM enthält, merken
5.) wenn jetzt als nächstes die Zeile "Mail rejected" enthält, hab ich den kompletten Datensatz, ansonsten die Zeilen RCPT TO und MAIL FROM wieder vergessen
6.) gucken, ob als nächstes ein connected to IP kommt, wenn ja, die erste Zeile (also 1.) auch vergessen, wenn nicht, beginnt eine neue Mail an den selbern MTA, also wenn es eine Zeile mit RCPT TO ist, merken...

...und so weiter...

Ich weiss, es ist nicht so einfach zu verstehen, aber vielleicht ist es jetzt etwas besser verständlich? Der Zeitstempel selbst, hat für mich keine Bedeutung. Den kann man auch leider nicht sinnvoll nutzen, um zusammengehörige Einträge zu identifizieren, da pro Sekunde hin und wieder mehrere Mails versendet werden. Das "XXX" steht auch nicht nur für den Zeitstempel, denn da steht auch noch der Prozess und die PID neben der Zeit mit drin.
Mitglied: 77559
77559 19.07.2010 um 08:15:05 Uhr
Goto Top
Hallo Fred,

ich habe dich auch schon Anfangs verstanden.
Um aber geeignete RegExp zu entwickeln ist schon der genaue Aufbau der Zeilen notwendig, nicht eine idealisierte Version.
Wenn da vertrauliche Informationen drin sind, neutralisiere sie eben.
Besteht der reason bei rejected aus mehreren Worten?

Im Prinizp würde ich die Adressen aus den gefundenen Zeilen in eine Variable setzen und erst mit der rejected Zeile ausgeben.

Funktioniert der grep-Befehl von oben denn?

Gruß
LotPings

PS: Vom Scripten verstehe ich einiges, bei der bash (einschl. sed, awk) bin ich aber noch Anfänger