Parsen Sie das vsftpd-Protokoll mit einem Shell-Skript

0

Ich versuche diese Zeile mit vsftpd zu parsen:

Sun Apr 7 07:23:33 2013 [pid 23590] [cam02430] OK UPLOAD: Client "206.132.183.209", "/20130407/07/20130407_072324D.avi", 496846 bytes, 383.38Kbyte/sec

mit:

cut -d" " -f9 | sed 's/\[\(.*\)\]/\1/'

Dadurch wird der Benutzername erfolgreich analysiert. Dies ist: cam02430

Aber jetzt hat sich das Datum geändert:

Wed Apr 10 10:37:50 2013 [pid 26137] [cam02299] OK UPLOAD: Client "206.132.183.201", "/20130410/10/20130410_103802D.avi", 496838 bytes, 363.67Kbyte/sec

Um dies zu analysieren, muss ich Folgendes verwenden:

cut -d" " -f8 | sed 's/\[\(.*\)\]/\1/'

Gibt es eine bessere Möglichkeit, den Benutzernamen in einer Zeile zu analysieren? Ich möchte mich an ein Shell-Skript halten.

Tom
quelle

Antworten:

1

Mein erster Instinkt ist, den Benutzeranteil zu isolieren (mit grep -o ). Das Gute daran ist, dass es eine (relativ) einzigartige Markierung hat - die Klammern.

Das folgende Grep isoliert also die (zwei) Felder mit Klammern und entfernt dann das erste Feld (Prozess-ID) und entfernt dann die Klammer von den verbleibenden Feldern (Benutzerfeld).

 < vsftp.log grep -o '\[[^]]*\] *\[[^]]*\]' | sed -e 's/\[[^]]*\] *//' -e 's/\[\(.*\)\]/\1/'

Wenn Sie sicherstellen können, dass der Benutzername keine Leerzeichen enthält, können Sie dies ausnutzen und die Dinge ein wenig vereinfachen. Suchen Sie das in eckige Klammern gesetzte Feld ohne Leerzeichen (das PID-Feld würde sie enthalten) und schneiden Sie es dann ab.

< vsftp.log grep -o '\[[^] ]*\]' | sed -e 's/\[\(.*\)\]/\1/'

Es funktioniert, ist aber möglicherweise nicht optimal.

Rich Homolka
quelle
Ich kann garantieren, dass die Benutzernamen keine Leerzeichen enthalten. Vielen Dank.
Tom