【问题标题】:Applying Unix's Head on AWK Through Find Command通过 Find 命令在 AWK 上应用 Unix 的 Head
【发布时间】:2010-10-17 01:15:51
【问题描述】:

我想在 find 给出的文件列表中输出前 10 行 AWK 命令, 使用这个 sn-p:

$ 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

【问题讨论】:

  • 请说明您要做什么。看来您正试图同时实现两件事。
  • @YuvalF: 1. 使用 AWK 过滤掉第 9 列中包含 "" 的行; 2. 仅显示前 10 行 - 在过滤器之后。
  • 试试我的更新解决方案。
  • 再次使用文件名打印作为分隔符。

标签: linux unix find awk head


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      根据 Ashawley 的回答:

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

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

      【讨论】:

      • 它在第十条记录之后退出,但不是在第十条打印行之后退出,这是 OP 想要的并且 ashawley 的答案提供了。
      【解决方案4】:

      只使用awk 应该可以工作:

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

      【讨论】:

      • @mouviciel:谢谢。我怎样才能让它也打印正在处理的文件名?
      【解决方案5】:

      你也可以这样做:

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

      没有head

      【讨论】:

      • @Zsolt:我试过了。对于每个文件,即使在第 10 行之后,您的 sn-p 也会继续运行。
      • @Zsolt:谢谢。我怎样才能让它也打印文件名(作为分隔符)?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      • 2021-12-05
      • 2011-11-01
      • 2014-09-19
      • 2017-12-06
      • 2012-07-03
      相关资源
      最近更新 更多