Zum Inhalt springen

Alle Zeilen zwischen zwei Werten aus einer Datei filtern

OpenVPN Schreibt seinen aktuellen Status in ein Logfile z.B. /etc/openvpn/openvpn-status.log

Das Logfile sieht in etwa wie folgt aus:

OpenVPN CLIENT LIST
Updated,Thu Jan 22 13:05:26 2009
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
ques,82.11.70.13:1593,279522,302161,Thu Jan 22 12:46:32 2009
gger,71.11.24.16:1383,297586,830169,Thu Jan 22 12:46:31 2009
burg,84.11.19.25:3789,4739798,21524789,Thu Jan 22 12:46:32 2009
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
10.98.0.145,burg,84.11.19.25:3789,Thu Jan 22 13:05:21 2009
10.98.0.94,gger,71.11.24.16:1383,Thu Jan 22 13:05:25 2009
10.98.0.34,ques,82.11.70.13:1593,Thu Jan 22 13:05:24 2009
GLOBAL STATS
Max bcast/mcast queue length,0
END

Wenn man das ganze jetzt gerne mit einem Bash-Script weiterverabeiten will (z.b. in einer MySQL Tabelle Protokollieren wer wann angemeldet war und wie viele Daten übertragen wurden), dann steht man vor dem Problem dass einen in erster Linie die Daten zwischen der Zeile die mit „Common Name“ beginnt und der Zeile mit „ROUTING TABLE“ interessieren und der Rest stört einfach nur!

Wie bekommt man das ganze also möglichst bereinigt retour?

Folgender Befehl löst das ganze für uns auf:

sed -n -e ‚/^Common Name/,/^ROUTING TABLE/p‘ openvpn-status.log | sed -e ‚1d‘ -e ‚$d‘

sed wächst mir genau wie awk immer mehr ans Herz 🙂

Der Parameter „-n“ steht für silent, wir verzichten also auf unnötigen Schnickschnack. Mit „-e“ wird das Konstrukt zwischen den beiden Anführungszeichen ausgewertet – „^Common Name“ ist der Anfang der Ausgabe – wobei „^“ sed anweist nur „Common Name“ am Anfang einer Zeile als Treffer zu werten. „^ROUTING TABLE“ markiert dann das Ende der Ausgabe – wieder nur wenn es am Anfang einer Zeile steht.

Bis hierher würde unsere Ausgabe also wie folgt aussehen:

Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
ques,82.11.70.13:1593,279522,302161,Thu Jan 22 12:46:32 2009
gger,71.11.24.16:1383,297586,830169,Thu Jan 22 12:46:31 2009
burg,84.11.19.25:3789,4739798,21524789,Thu Jan 22 12:46:32 2009
ROUTING TABLE

Jetzt stört uns natürlich noch die erste und letzte Zeile!

Die bekommen wir mit dem Abschließenden „sed -e ‚1d‘ -e ‚$d'“ weg, wobei „1d“ besagt dass die erste „1“ Zeile gelöscht „d“ werden soll und „$d“ die letzte („$“ steht für die letzte Zeile und „d“ wieder für Löschen).

Und schon sieht unsere Ausgabe exakt wie gewünscht aus:

ques,82.11.70.13:1593,279522,302161,Thu Jan 22 12:46:32 2009
gger,71.11.24.16:1383,297586,830169,Thu Jan 22 12:46:31 2009
burg,84.11.19.25:3789,4739798,21524789,Thu Jan 22 12:46:32 2009

Soweit so gut, jetzt braucht das ganze nur noch ausgewertet werden und in einer MySQL Tabelle landen und schon hat man eine wunderbare Statistik wer wann mit OpenVPN angemeldet war und wie viel in etwa übertragen wurde. Die bash im Zusammenspiel mit sed, awk und mysql wird sich gerne darum kümmern…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert