我需要过滤列表文件(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 来完成相同的工作绝不是一个好主意;您必须选择其中之一并调整模式上的正则表达式以满足您的需求