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.log
Ausgabe 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.log
wird 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