Warum wird “awk… file | Tee-Datei ”Datei abschneiden? [Duplikat]
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
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