Applicazione di Head di Unix su AWK tramite il comando Find
Domanda
Voglio produrre le 10 righe principali di comando AWK nell'elenco dei file forniti da Find, usando questo frammento:
$ find . -name "*.txt" -print -exec awk '$9 != ""' \| head -n10 {} \;
Nota anche che voglio stampare i nomi dei file in fase di elaborazione.
Ma perché ottengo questo errore:
awk: cmd. line:2: fatal: cannot open file `|' for reading (No such file or directory)
./myfile.txt
Qual è il modo giusto per farlo?
Ho provato senza barra rovesciata prima della pipe.Ancora ha dato un errore:
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
Soluzione
Se vuoi eseguire un programma Awk su ogni file, scopri che stampa solo le prime 10 righe ogni volta.
$ find . -name "*.txt" -print -exec awk '$9 != "" && n < 10 {print; n++}' {} \;
Altri suggerimenti
Quando si esegue un comando con -exec di find, non si ottiene tutte le cose belle della shell come l'operatore di pipe (|). Si possono ritrovare eseguendo in modo esplicito una subshell, se vi piace, però, ad esempio:
trova. -name '* .txt' exec / bin / sh -c "echo un file di testo chiamato {} | head -n 15" \;
In base a risposta di Ashawley:
find . -name "*.txt" -print -exec awk '$9 != "" {print; if(NR > 9) exit; }' {} \;
Si deve funzionare meglio, come abbiamo uscita awk dopo il 10 ° record.
Utilizzando awk
solo dovrebbe funzionare:
find . -name "*.txt" -print -exec awk '{if($9!=""&&n<11){print;n++}}' {} \;
Si può fare in questo modo troppo:
find . -name '*txt' -print -exec awk 'BEGIN {nl=1 ;print FILENAME} $9 !="" {if (nl<11) { print $0 ; nl = nl + 1 }}' {} \;
senza head
.