组合使用 find + grep + awk

组合使用 find + grep + 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)

第二次尝试:

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

find: missing argument to `-exec'

有什么帮助吗?谢谢

答案1

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

find . -name "high-cpu.out" -exec awk '/jboss/ { print $5 }' {} +

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

当你尝试时

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

外壳首先处理管道,而不是find。这导致了find“missing argument to '-exec'”的失败:{} \;没有包含在传递给它的参数中(它们被传递给了awk)。

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

答案2

寻找 。 -name“high-cpu.out”-exec grep“jboss” | -name“high-cpu.out”-exec grep“jboss”| awk '{ print $5 }' {} ;

查找:缺少用于读取的 {}' 参数-exec' awk: fatal: cannot open file(没有此类文件或目录)

在 exec 命令在“|”处中断/完成之前,这无法工作。 level 因此 {} 不能由 awk 子命令解释。

所以你必须做

.......  -exec awk '/pattern/ {operation}' {} +

或者

 find . -name "high-cpu.out" -exec grep pattern {} \; | awk '{operation}'

但使用许多命令 sed+awk+grep 来完成相同的工作绝不是一个好主意;您必须选择其中之一并调整模式上的正则表达式以满足您的需求

相关内容