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)

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つを選択し、必要に応じてパターンの正規表現を調整する必要があります。

関連情報