Nur einen Teil der Protokolldatei im Bash-Skript anzeigen

274
Lennart Rolland

Das OpenVPN-Protokoll sieht folgendermaßen aus:

OpenVPN  CLIENT LIST Updated,Sat Jun 20 04:20:07 2015 Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since [ A .... ] ROUTING TABLE Virtual Address,Common Name,Real Address,Last Ref [ B.... ] GLOBAL STATS Max bcast/mcast queue length,33 END 

Wobei A und B oben Listen von Hosts sind, die auf bestimmte Weise formatiert sind.

Ich habe ein Bash-Skript, das ich verwenden werde, um auf die Elemente im Teil namens "ROUTING TABLE" ( B ) einzuwirken . Wie kann ich diese Liste der Hosts in meinem Skript effizient vom Rest des Dokuments trennen?

-1

2 Antworten auf die Frage

1
MariusMatutiae

Der folgende sed- Befehl

 sed -n '/ROUTING/,/\[ B/' filename 

macht das, was Sie möchten: Die Option -n unterdrückt das Standardverhalten beim Drucken jeder Zeile, der Ausdruck zwischen einfachen Anführungszeichen wählt einen Zeilenbereich aus und druckt sie dann (dies ist die Bedeutung von ). Die auszuwählenden Bereiche werden durch Übereinstimmungen (die erste und die letzte) identifiziert, die durch Trennzeichen getrennt sind. In meinem Fall verwende ich den Schrägstrich /als Trennzeichen. Die erste und letzte Musterübereinstimmung muss durch ein Komma getrennt werden. Mit \ [ wird die wörtliche Bedeutung der eckigen Klammern hervorgehoben, dh es handelt sich nicht um eine grammatikalische Struktur, sondern um eine echte eckige Klammer, die gefunden werden muss.

1
meuh

Mit sed können Sie (d) Zeilen von Zeile 1 bis zur entsprechenden Startzeile löschen. Dann löschen Sie Zeilen von der übereinstimmenden Endzeile bis zur letzten Zeile ($). Möglicherweise möchten Sie auch die Kopfzeile "Virtuelle Adresse" löschen. Alles was übrig bleibt ist, was du willst!

sed '1,/^ROUTING TABLE/d /^Virtual Address,/d /^GLOBAL STATS/,$d' 
Das hat für mich am meisten Sinn gemacht, damit Sie die Stimme bekommen. Lennart Rolland vor 8 Jahren 0