
一部の情報を取得するには、リストファイル(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)
2回目の試み:
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
「 '-exec'の引数がありません」エラーが発生しました。{} \;
渡された引数に含まれていません(それらはawk
)。
2回目の試みは失敗します。これは、閉じるセミコロンがパラメータから分離されて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コマンドが "|"で中断/完了するまで機能しません。したがって、{}はawkサブコマンドとして解釈できません。
だからあなたはする必要があります
....... -exec awk '/pattern/ {operation}' {} +
または
find . -name "high-cpu.out" -exec grep pattern {} \; | awk '{operation}'
しかし、同じことをするためにsed + awk + grepコマンドをたくさん使うことは決して良い考えではありません。そのうちの1つを選択し、必要に応じてパターンの正規表現を調整する必要があります。