通过Find命令将Unix的Head应用到AWK上

发布于 2024-07-16 09:42:25 字数 560 浏览 8 评论 0原文

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

$ 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

I want to output top 10 lines of AWK command in the list of files given by find,
using this snippet:

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

Note also that I want to print out the file names being processed.

But why I get such error:

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

What's the right way to do it?

I tried without backslash before the pipe. Still it gave an 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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

開玄 2024-07-23 09:42:25

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

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

When running a command with find's -exec, you don't get all the nice shell things like the pipe operator (|). You can regain them by explicitly running a subshell if you like though, eg:

find . -name '*.txt' -exec /bin/sh -c "echo a text file called {} | head -n 15" \;

九公里浅绿 2024-07-23 09:42:25

如果您想对 find 中的每个文件运行 Awk 程序,每次仅打印前 10 行。

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

If you want to run an Awk program on every file from find that only prints the first 10 lines each time.

$ find . -name "*.txt" -print -exec awk '$9 != "" && n < 10 {print; n++}' {} \;
忘羡 2024-07-23 09:42:25

根据 Ashawley 的回答:

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

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

Based on Ashawley's answer:

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

It should perform better, as we exit awk after the 10th record.

っ〆星空下的拥抱 2024-07-23 09:42:25

仅使用 awk 应该有效:

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

Using awk only should work:

find . -name "*.txt" -print -exec awk '{if($9!=""&&n<11){print;n++}}' {} \;
太阳哥哥 2024-07-23 09:42:25

您也可以这样做:

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

没有 head

You can do it this way too:

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

without head.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文