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
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top