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