So lösen Sie den Fehler "Broken Pipe" bei Verwendung von awk mit Kopf

2306
Jon

Ich bekomme gebrochene Pipe-Fehler von einem Befehl, der Folgendes bewirkt:

ls -tr1 /a/path | awk -F '\n' -vpath=/prepend/path/ '' | head -n 50 

Im Wesentlichen möchte ich (mit dem absoluten Pfad) die ältesten X-Dateien in einem Verzeichnis auflisten.

Es scheint, dass die Ausgabe korrekt ist (ich bekomme 50 Dateipfade), aber wenn head die 50 Dateien ausgegeben hat, wird stdin geschlossen, was dazu führt, dass awk einen fehlerhaften Pipe-Fehler ausgibt, da immer noch mehr Zeilen ausgegeben werden.

1
Beantworten Sie Ihre Frage mit dem Button ** Beantworten Sie Ihre Frage **, sobald Sie können! Dann können Sie sogar den Ruf dafür bekommen und es akzeptieren. slhck vor 12 Jahren 0
Ich hätte es getan, aber als neuer Benutzer kann ich das nicht für weitere 5 Stunden machen. Ich wollte die Antwort aufschreiben, um sie nicht zu vergessen. Jon vor 12 Jahren 0

1 Antwort auf die Frage

0
slhck

Solution from the OP, revision 2


Turns out I was being pretty dumb.

Firstly there is no need to have awk prepend the path to every single file just to throw most of it away. So the awk statement should be the last pipe.

Secondly instead of reversing sorting with ls we can do a standard time sort and use tail to extract the lines we're after. This ensure the pipe remains open for the entire process.

The new command would look like:

ls -t1 /a/path | tail -n 50 | awk -F '\n' -vpath=/prepend/path/ ''