Ich versuche, tail -f in awk zu leiten, um eine Protokolldatei in Echtzeit zu überwachen, aber Beispielen zufolge sollte es kein Problem geben, aber ich kann es nicht zum Laufen bringen.
Hier ist der Befehl, den ich ausführe
tail -f logfile.log | awk -F" " '{print $1, $2, $7, $8}'
Wenn ich meine Datei jedoch mit nano edit a line bearbeite, wird sie nicht in Echtzeit gedruckt. Wenn ich den Befehl awk direkt ausführe, wird meine neue Zeile im Ergebnis angezeigt.
Antworten:
Sie sehen es nicht in Echtzeit, da Rohre aus Effizienzgründen gepuffert werden.
tail -f
muss den Puffer füllen, typischerweise 4 kB, bevor die Ausgabe an übergeben wirdawk
.Ein Fix besteht darin, den Unbuffer-Befehl zu verwenden, der Teil des Expect-Pakets ist:
Dies führt
tail
zu dem Gedanken, dass es in ein interaktives Terminal schreibt. Infolgedessen puffert es nicht.Weitere Informationen finden Sie unter /unix/25372/turn-off-buffering-in-pipe
Wenn Sie über GNU coreutils 7.5 oder besser verfügen, können Sie alternativ die Ausgabepufferung mit dem Befehl stdbuf deaktivieren:
quelle
tail
. Können Sie versuchen, ohne den Editor nur an die Datei anzuhängen? Führen Sie beispielsweisedate >>logfile.log
einige Male in einem Fenster aus und prüfen Sie, obawk
die Aktualisierungen in einem anderen Fenster gedruckt werden.nano
ich verschiedene Ergebnisse erhalten, je nachdem, wie ich die Datei vor dem Speichern bearbeitet habe. Die Verwendungecho "My long string here" >> logfile.log
funktioniert jedoch jedes Mal bei mir.Ich denke, die Antwort von @ John1024 ist nicht ganz richtig, da das
stdbuf -o0
Präfix falsch platziert ist. Es gehört als Präfix zumawk
Befehl, nicht zumtail -f
Befehl, daher sollte der richtige Befehl lauten:Beachten Sie auch, dass nicht alle Versionen von awk in dieser bestimmten Konfiguration funktionieren. IOW, wenn Sie diese bestimmte Befehlszeichenfolge benötigen, um wie geschrieben zu funktionieren, probieren Sie verschiedene awk / gawk / mawk-Versionen aus, bis Sie eine finden, die funktioniert.
quelle
Sie können die Pufferung aufheben, indem Sie eine while-Schleife hinzufügen, wie im folgenden Beispiel angegeben. Ich habe dies an einer laufenden Protokolldatei getestet und es hat bei mir funktioniert.
quelle
while read
wenn Sie können. Wenn Sie nicht können, würde das Platzieren desawk
Rohrs nach demdone
die Leistung etwas verbessern. Die richtige Lösung besteht jedoch darin, die Pufferung zu deaktivieren und nicht zu umgehen.unbuffer
stdbuf
awk
jede Zeile ein neuer Prozess erstellt, anstatt ihn einmal auszuführen.Weder stdbuf noch unbuffer scheinen für mich zu funktionieren (Ubuntu 18.04), aber die Verwendung einer Named Pipe funktioniert. Ich habe ein Shell-Skript erstellt, das Folgendes enthält:
quelle