Appliquer la tête d’Unix sur AWK grâce à la commande Find

Je souhaite afficher les 10 premières lignes de la commande AWK dans la liste des fichiers fournis par find, à l’aide de cet extrait:

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

Notez également que je souhaite imprimer les noms de fichiers en cours de traitement.

Mais pourquoi j’ai une telle erreur:

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

Quelle est la bonne façon de le faire?

J’ai essayé sans backslash avant la pipe. Il a quand même donné une erreur:

 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 

Si vous voulez exécuter un programme Awk sur chaque fichier de find, il imprime uniquement les 10 premières lignes à chaque fois .

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

Lorsque vous exécutez une commande avec find’s -exec, vous n’obtenez pas toutes les fonctionnalités du shell comme l’opérateur de canal (|). Vous pouvez les récupérer en exécutant explicitement un sous-shell si vous le souhaitez, par exemple:

trouver . -name ‘* .txt’ -exec / bin / sh -c “renvoie un fichier texte appelé {} | head -n 15” \;

Basé sur la réponse d’Ashawley:

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

Il devrait mieux fonctionner, car nous sortons de awk après le 10ème record.

Utiliser awk only devrait fonctionner:

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

Vous pouvez le faire aussi:

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

sans head