2009-04-02 25 views
2

finden Command I zur Ausgabe von oben wollen 10 Zeilen AWK Befehl in der Liste der Dateien gegeben durch finden, mit diesen Schnipsel: auchDurch Anwenden von Unix Kopf auf AWK

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

Beachten Sie, dass ich aus drucken möchten die Dateinamen werden verarbeitet.

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 versuchte 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 
+0

Bitte erläutern Sie, was Sie zu tun versuchen. Es scheint, als ob Sie versuchen, zwei Dinge auf einmal zu erreichen. –

+0

@YuvalF: 1. Mit AWK Filter Zeilen, die "" in der 9. Spalte enthalten; 2. Zeige nur die obersten 10 Zeilen - nach dem Filter. – neversaint

+0

Versuchen Sie meine aktualisierte Lösung. –

Antwort

3

Falls Sie ein awk-Programm auf jede Datei ausführen möchten aus feststellen, dass nur druckt die ersten 10 Zeilen jedes Mal.

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

Auch Sie können es auf diese Weise tun:

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

ohne head.

+0

@ Zsolt: Ich habe es versucht. Für jede Datei wird Ihr Snippet auch nach der 10. Zeile fortgesetzt. – neversaint

+0

@Zsolt: Danke. Wie kann ich es machen, dass der Dateiname auch (als Trennzeichen) gedruckt wird? – neversaint

4

Wenn Sie einen Befehl mit finds -exec ausführen, erhalten Sie nicht alle netten Shell-Dinge wie den Pipe-Operator (|). Sie können sie wiedererlangen, indem Sie eine Untershell explizit ausführen, wenn Sie möchten, zB:

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

1

Mit awk sollte nur funktionieren:

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

@mouviciel: danke. Wie kann ich es machen, den Dateinamen in Bearbeitung zu drucken? – neversaint

+0

Es tut dies: Dies ist die -print-Flag Ihres Find-Befehls. – mouviciel

+0

@mouviciel: Danke, hab es. – neversaint

2

Basierend auf Ashawley Antwort:

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

Es sollte eine bessere Leistung, da wir awk nach der 10. Aufzeichnung beenden.

+0

Es endet nach dem zehnten Datensatz, aber nicht nach der zehnten gedruckten Zeile, was das OP wollte und Ashawleys Antwort liefert. –

Verwandte Themen