2

我想使用以下代码段在 find 给出的文件列表中输出前 10 行 AWK 命令:

$ 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
4

5 回答 5

4

当使用 find 的 -exec 运行命令时,您不会得到像管道运算符 (|) 这样的所有漂亮的 shell 东西。如果您愿意,您可以通过显式运行子shell 来重新获得它们,例如:

寻找 。-name '*.txt' -exec /bin/sh -c "回显一个名为 {} | head -n 15" \; 的文本文件

于 2009-04-02T07:41:50.403 回答
3

如果您想对 find 中的每个文件运行一个 awk 程序,每次只打印前 10

$ find . -name "*.txt" -print -exec awk '$9 != "" && n < 10 {print; n++}' {} \;
于 2009-04-03T14:28:08.087 回答
2

根据 Ashawley 的回答:

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

它应该表现更好,因为我们在第 10 条记录后退出 awk。

于 2009-04-06T16:44:47.327 回答
1

你也可以这样做:

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

没有head

于 2009-04-02T07:21:57.937 回答
1

仅使用awk应该有效:

find . -name "*.txt" -print -exec awk '{if($9!=""&&n<11){print;n++}}' {} \;
于 2009-04-02T07:44:55.667 回答