Categories: Linux

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…

Manfred

Recent Posts

VM – ZFS Partition online vergrößern

Man macht es nicht jeden Tag, darum schadet es nicht sich's kurz zu notieren... Hier…

1 Jahr ago

Samba Password History für einen User löschen

Meine Suche bei Google hatte mal wieder keinen vernünftigen Treffer gelandet, das Problem - ich…

1 Jahr ago

HP Eine Firma von der ich nicht mal geschenkte Drucker nehmen würde!!!

Ich muss mal eben etwas Druck ablassen, ein Kunde von mir setzt einen Drucker von…

2 Jahren ago

IRMC Console Redirection ohne Lizenz

Wer beim Server bestellen vergessen hat die erweiterte IRMC Lizenz zu ordern, der steht vor…

2 Jahren ago

WOL im BIOS aktivieren reicht nicht immer

Ich nutze seit langer Zeit ein System für meine Backups welches in der Nacht von…

2 Jahren ago

Apache Guacamole mit TOPT – funktioniert nicht

Es scheint wohl eine noch nicht so häufig genutzte Kombination zu sein - Apache Guacamole…

2 Jahren ago