ファイルのリスト内の出現箇所を検索し、その数を数える

ファイルのリスト内の出現箇所を検索し、その数を数える

ディレクトリ ツリー内に大量のスレッド ダンプが保存されています (30 分ごとに 1 つのフォルダー)。

1 つのファイルに含まれるスレッドの数を数えようとしています。 これまでのところ、次のようになりました。

find . -name 'high-cpu-tdump.out' -exec grep -H "Thread-" {} \;

返される結果:

./cbsmtjfuprd2/2021.10.22-06.30/high-cpu-tdump.out:"Thread-0 (HornetQ-server-HornetQServerImpl::serverUUID=7582b137-83b1-11e9-bc0d-b5863efb47a2-961209098)" #123 prio=5 os_prio=0 tid=0x00007f01a45be000 nid=0x4a4 waiting on condition [0x00007f010b730000]
./cbsmtjfuprd2/2021.10.22-06.30/high-cpu-tdump.out:"Thread-1 (HornetQ-scheduled-threads-2107959528)" #121 prio=5 os_prio=0 tid=0x00007f01c01ff800 nid=0x4a2 waiting on condition [0x00007f0130897000]
./cbsmtjfuprd2/2021.10.22-06.30/high-cpu-tdump.out:"Thread-0 (HornetQ-Asynchronous-Persistent-Writes221963927-1847608919)" #120 daemon prio=5 os_prio=0 tid=0x00007f01a4527000 nid=0x49a waiting on condition [0x00007f0131487000]
./cbsmtjfuprd2/2021.10.22-06.30/high-cpu-tdump.out:"Thread-0 (HornetQ-scheduled-threads-2107959528)" #116 prio=5 os_prio=0 tid=0x00007f01a4377800 nid=0x490 waiting on condition [0x00007f0131ce4000]
. . . . . .

これは良いスタートですが、各ファイルにいくつのスレッドが含まれているかを知るために、これを 'wc -l' で連鎖させる必要があります。いくつか試してみましたが、すべて失敗しています。

find . -name 'high-cpu-tdump.out' -exec grep -H "Thread-" {} | wc -l \;
find: missing argument to `-exec'

find でそれが実行可能かどうか、または各ファイルを dir ごとにチェックするスクリプトを作成する必要があるかどうかについて、ご意見はありますか?

答え1

明示的なシェル呼び出しを使用せずに、wc -lコマンドgrepの一部としてパイプすることはできません。-execsh -c

find  . -name 'high-cpu-tdump.out' -exec sh -c 'grep -H "Thread-" {} | wc -l' ';'

しかし、これを実行するとないパターンが見つかったファイル名を生成します。これを確実に行うには、sh -cファイル名と関連する単語数を出力するシェルループを内部で使用することをお勧めします。

find . -name 'high-cpu-tdump.out' -exec sh -c '
    for file; do printf "%s %s\n" "file" $(grep -c "Thread-" "$file") ; done' -- {} +

または、grepfindを使わずに単独で使用し、--include再帰的にファイルのみを検索するglob式を提供するフラグ(GNU / BSDバリアント)を使用します。

grep -r -c 'Thread-' --include='high-cpu-tdump.out' .

また、リプレイこれはデフォルトでファイルを再帰的にgrepし、はるかに高速です(ソース)。

rg -c 'Thread-' -g 'high-cpu-tdump.out'

関連情報