组合使用 find + grep + awk

Fra*_*oni 1 grep find awk

我需要过滤列表文件(top 命令的输出)以获取一些信息:

  • 首先我需要用 find 列出文件
  • 然后,我需要 grep 查找具有模式的行
  • 最后,我需要挑选一个我感兴趣的专栏。

似乎我无法使用 grep 和 awk 绑定查找:

我的第一次尝试:

find . -name "high-cpu.out" -exec grep "jboss" | awk '{ print $5 }' {} \;

find: missing argument to `-exec'
awk: fatal: cannot open file `{}' for reading (No such file or directory)
Run Code Online (Sandbox Code Playgroud)

第二次尝试:

find . -name "high-cpu.out" -exec grep "jboss" {} \ | awk '{ print $5 }';

find: missing argument to `-exec'
Run Code Online (Sandbox Code Playgroud)

有什么帮助吗?谢谢

Ste*_*itt 5

我建议使用 AWK 来匹配模式,而不是grep

\n
find . -name "high-cpu.out" -exec awk '/jboss/ { print $5 }' {} +\n
Run Code Online (Sandbox Code Playgroud)\n

这也允许使用 的+变体-exec,从而减少awk调用次数。

\n

当你尝试时

\n
find . -name "high-cpu.out" -exec grep "jboss" | awk '{ print $5 }' {} \\;\n
Run Code Online (Sandbox Code Playgroud)\n

外壳首先处理管道,而不是find。这导致find失败, \xe2\x80\x9cmissing argument to \xe2\x80\x98-exec\xe2\x80\x99\xe2\x80\x9d: was {} \\;\xe2\x80\x99t 包含在传递给它的参数中(它们被传递给awk)。

\n

您的第二次尝试失败了,因为find\xe2\x80\x99 无法看到结束分号,因为它没有与参数分开awk。在任何情况下,管道都不会工作,因为find它不会委托给 shell。

\n