Warum wird “awk… file | Tee-Datei ”Datei abschneiden? [Duplikat]

Sep 20 2020

Warum schneidet diese Pipeline die Datei ab:

awk '...' file | tee file

während cates zuerst geht nicht?

cat file | awk '...' | tee file

Die Datei ist nur eine reguläre Konfigurationsdatei mit Hunderten von Zeilen. Und ich teevermeide es sponge(da ich es moreutilszuerst installieren muss ).

Antworten

10 LjmDullaart Sep 21 2020 at 06:37

Sie werden auf lange Sicht feststellen, dass dieses Verhalten nicht konsistent ist.

Das Problem ist, dass teezu einem bestimmten Zeitpunkt die Datei zum Schreiben geöffnet wird. Von diesem Moment an wird die Datei abgeschnitten. Das ist unabhängig davon, welches Programm die Datei liest.

Es kommt einfach vor, dass dies catsehr schnell geht und dass das Lesen der Datei anscheinend abgeschlossen ist, bevor teedie Datei geöffnet wird. Wenn zum Beispiel die Systemlast größer ist, wurde sie catmöglicherweise noch nicht fertiggestellt, und die Pipeline mit wird catmöglicherweise ebenfalls abgeschnitten.

Schreiben Sie also nicht in dieselbe Datei, aus der Sie Ihre Pipeline lesen. Verwenden Sie stattdessen Gnu awkist -i inplace, oder wenn das nicht auf Ihrem System, Verwendung

cp file file.tmp &&
awk '...' file.tmp | tee file