Was macht grep line buffering?

25

Hier ist mein Befehl, den ich in einem Skript verwende, um grepDaten in Echtzeit zu erhalten. Es scheint Echtzeitdaten nicht korrekt abzurufen, da nur einige Zeilen fehlen.

tail -f <file> | fgrep "string" | sed 's/stuff//g' >> output.txt

Was würde der folgende Befehl tun? Was ist "Zeilenpufferung"?

tail -f <file> | fgrep --line-buffered "string" | sed 's/stuff//g' >> output.txt
Roboman1723
quelle

Antworten:

44

Wenn die meisten Standardbefehle nicht interaktiv verwendet werden, grepwird die Ausgabe gepuffert, dh, es werden nicht sofort Daten geschrieben stdout. Es sammelt große Datenmengen (abhängig vom Betriebssystem, unter Linux häufig 4096 Byte), bevor es geschrieben wird.

In Ihrem Befehl, grepwird ‚s Ausgang geleitet stdinvon sedBefehl, so grepseine Ausgabe puffern.

Also, --line-bufferedwas Option grepZeilenpuffer verwendet wird , bedeutet die Ausgabe geschrieben wird jedes Mal , wenn eine neue Zeile sah, anstatt zu warten , 4096 Bytes standardmäßig zu erreichen. Aber in diesem Fall brauchst du gar nicht grep, benutze einfach tail+ sed:

tail -f <file> | sed '/string/s/stuff//g' >> output.txt

Mit dem Befehl, der keine Option zum Ändern des Puffers hat, können Sie GNU coreutils stdbuf verwenden

tail -f <file> | stdbuf -oL fgrep "string" | sed 's/stuff//g' >> output.txt

Aktivieren der Zeilenpufferung oder -o0Deaktivieren des Puffers.

Hinweis

cuonglm
quelle