Применение головы Unix к AWK с помощью команды поиска - PullRequest
2 голосов
/ 02 апреля 2009

Я хочу вывести первые 10 строк команды AWK в список файлов, заданных командой find, используя этот фрагмент:

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

Обратите внимание, что я хочу распечатать имена обрабатываемых файлов.

Но почему я получаю такую ​​ошибку:

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

Как правильно это сделать?

Я пробовал без обратной косой черты перед трубой. Тем не менее это дало ошибку:

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

Ответы [ 5 ]

4 голосов
/ 02 апреля 2009

Когда вы запускаете команду с find -exec, вы не получаете все приятные вещи оболочки, такие как оператор канала (|). Вы можете восстановить их, явно запустив подоболочку, например:

найти. -name '* .txt' -exec / bin / sh -c "вывести текстовый файл с именем {} | head -n 15" \;

3 голосов
/ 03 апреля 2009

Если вы хотите запускать программу Awk для каждого файла из find, который печатает только первые 10 строк каждый раз .

$ find . -name "*.txt" -print -exec awk '$9 != "" && n < 10 {print; n++}' {} \;
2 голосов
/ 06 апреля 2009

На основании ответа Эшоули:

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

Он должен работать лучше, когда мы выйдем из awk после 10-й записи.

1 голос
/ 02 апреля 2009

Использование awk должно работать только:

find . -name "*.txt" -print -exec awk '{if($9!=""&&n<11){print;n++}}' {} \;
1 голос
/ 02 апреля 2009

Вы тоже можете сделать это так:

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

без head.

...