Frage

Ich möchte Ausgabe Top-10 Zeilen AWK Befehl in der Liste der Dateien, die von Fund gegeben, mit diesem Code-Schnipsel:

$ find . -name "*.txt" -print -exec awk '$9 != ""'  \| head -n10 {} \;

Beachten Sie auch, dass ich aus den Dateinamen, das verarbeitet wird gedruckt werden soll.

Aber warum ich eine solche Fehlermeldung erhalten:

awk: cmd. line:2: fatal: cannot open file `|' for reading (No such file or directory)
./myfile.txt

Was ist der richtige Weg, es zu tun?

Ich habe versucht, ohne Backslash vor dem Rohr. Dennoch gab es einen Fehler:

find: missing argument to `-exec'
head: cannot open `{}' for reading: No such file or directory
head: cannot open `;' for reading: No such file or directory
War es hilfreich?

Lösung

Wenn Sie ein awk-Programm auf jede Datei ausführen aus feststellen, dass nur druckt die ersten 10 Zeilen jeder .

$ find . -name "*.txt" -print -exec awk '$9 != "" && n < 10 {print; n++}' {} \;

Andere Tipps

Wenn Sie einen Befehl mit FIND -exec läuft, bekommt man nicht all die schönen Schal Dinge wie der Rohroperator (|). Sie können sie wiedergewinnen, indem Sie explizit ein Sub-Shell laufen, wenn Sie zwar gerne, zum Beispiel:

finden. -name '* .txt' exec / bin / sh -c "echo eine Textdatei namens {} | head -n 15" \;

Basierend auf Ashawley Antwort:

find . -name "*.txt" -print -exec awk '$9 != "" {print; if(NR > 9) exit; }' {} \;

Es sollte eine bessere Leistung, da wir nach dem 10. Rekord awk verlassen.

Mit awk sollte nur funktionieren:

find . -name "*.txt" -print -exec awk '{if($9!=""&&n<11){print;n++}}' {} \;

Sie können es auf diese Weise auch tun:

find . -name '*txt' -print -exec awk 'BEGIN {nl=1 ;print FILENAME} $9 !="" {if (nl<11) { print $0 ; nl = nl + 1 }}' {}  \;

ohne head.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top