Kombinierte Linux-Befehle schreiben keine outfile.txt

Kombinierte Linux-Befehle schreiben keine outfile.txt

Ich möchte in einer Protokolldatei (in Echtzeit) nach dem Inhalt von msg="yxyxyx" suchen und dann die eindeutigen Werte in outfile.txt schreiben

Ich habe das geschrieben:

tail -f /var/log/firewall.log | sed -n '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | awk '!seen[$0]++' >> outfile.txt

Outfile wurde erstellt, ist aber leer. Es wird einwandfrei in die Konsole geschrieben, ohne den Teil >> outfile.txt.

Danke schön!

Antwort1

könnten Sie stdbuf -oL oder stdbuf -o0 vor dem Awk-Befehl wie unten verwenden?

tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt

tail -f firewall.log | sed -nu '/msg=/{s/.msg=//;s/\S=.*//;p}' | stdbuf -o0 awk '!gesehen[$0]++' >> outfile.txt

Mann sed;

-u, --unbuffered

Laden Sie minimale Datenmengen aus den Eingabedateien und leeren Sie die Ausgabepuffer häufiger

Mann stdbuf;

stdbuf – Befehl mit geänderten Puffervorgängen für seine Standard-Streams ausführen.

-o, --output=MODE Standardpufferung des Ausgabestreams anpassen

Wenn MODE auf „L“ eingestellt ist, wird der entsprechende Stream zeilenweise gepuffert. Diese Option ist bei der Standardeingabe ungültig.

Wenn MODE „0“ ist, wird der entsprechende Stream nicht gepuffert.

Z.B;

führen Sie dies zuerst aus;

user@h$ tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt

Führen Sie dies in einem anderen Terminal aus; echo msg="1" >> firewall.logAusgabe wie unten;

user@h$ tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt

user@host$ cat outfile.txt
1

Führen Sie es erneut aus echo msg="1" >> firewall.log. Die Ausgabe hat sich nicht geändert.

Nach dem Ausführen dieses ; echo msg="2" >> firewall.logwird die folgende Ausgabe ausgegeben;

user@host$ tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt

user@host$ cat outfile.txt

1
2

verwandte Informationen