La aplicación de la Cabeza de Unix en AWK A través de comando Buscar
Pregunta
Quiero la parte superior de salida 10 líneas de comando AWK en la lista de ficheros dados por el hallazgo, utilizando este fragmento:
$ find . -name "*.txt" -print -exec awk '$9 != ""' \| head -n10 {} \;
Tenga en cuenta también que quiero imprimir los nombres de los archivos que se procesan.
Pero por qué me sale ese error:
awk: cmd. line:2: fatal: cannot open file `|' for reading (No such file or directory)
./myfile.txt
¿Cuál es la forma correcta de hacerlo?
He intentado sin barra invertida antes de la tubería. Aún así, dio un error:
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
Solución
Si desea ejecutar un programa awk en cada archivo desde encuentran que sólo imprime las primeras 10 líneas cada vez .
$ find . -name "*.txt" -print -exec awk '$9 != "" && n < 10 {print; n++}' {} \;
Otros consejos
Cuando se ejecuta un comando con -exec del hallazgo, no consigue todas las cosas shell agradables como el operador de canalización (|). Se puede recuperar mediante la ejecución de un subnivel de forma explícita si lo desea, sin embargo, por ejemplo:
encontrar. -name '* .txt' -exec / bin / sh -c "echo un archivo de texto llamado {} | cabeza -n 15" \;
Sobre la base de la respuesta de Ashawley:
find . -name "*.txt" -print -exec awk '$9 != "" {print; if(NR > 9) exit; }' {} \;
Debe realizar mejor, ya que salir de AWK después del 10 de grabación.
El uso de awk
sólo debe trabajar:
find . -name "*.txt" -print -exec awk '{if($9!=""&&n<11){print;n++}}' {} \;
Puede hacerlo de esta manera también:
find . -name '*txt' -print -exec awk 'BEGIN {nl=1 ;print FILENAME} $9 !="" {if (nl<11) { print $0 ; nl = nl + 1 }}' {} \;
sin head
.