Anwenden von Unix Kopf auf AWK Durch Befehl Suchen
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
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
.