内容が特定の正規表現と一致するファイルをディレクトリ(およびサブディレクトリ)から検索し、一致する各ファイルについて、そのファイル内の正規表現が一致する回数を一覧表示したいと思います。
たとえば、ファイルが次のような場合
line1
line2
line3
linea
lineb
正規表現はでline\d
、最初、2番目、3行目は正規表現と一致するため、番号3のファイルを見たいと思います。
このようなことをするにはどうすればよいですか?
答え1
パターンに一致するファイルを繰り返し検索するにはfind PATH -name PATTERN
- を参照してくださいman find
。検索方法コンテンツfind
マージするgrep
ファイルの数find … -exec grep PATTERN +
。最後に、GNUには一致数を計算する/フラグgrep
があります。--count
-c
$ cd "$(mktemp --directory)"
$ printf '%s\n' foo bar foo > first
$ printf '%s\n' bar foo bar > second
$ printf '%s\n' bar > third
$ find . -name '*r*' -exec grep --count foo {} +
./third:0
./first:2
答え2
スタイル正規表現に制限されていることに満足し、数が正規表現にegrep
一致する行数のみを計算する場合(正規表現が一致する合計数ではなく)、次の方法が役立ちます。
$ find /directory/name -type f -print | xargs egrep -c "line[0-9]" /dev/null
(/dev/null
最後はハッキングです。出力が中断され、最後に実行されたコマンドがxargs
ファイルfind
名egrep
のみで呼び出される場合です。この場合、カウントは印刷されますが、カウントが適用されるファイル名は印刷されません。)
危険に住んでいてPerlスタイルの正規表現を使用したい場合は、代わりに使用することができますが、grep -P
実行egrep
しているシステムによっては機能しない場合があります。
答え3
利用可能な再帰バージョンですgrep
。ファイル名だけが必要な場合は、次のことができます。
grep -rl regex *
wc -l
上記の出力を送信すると、一致するファイル数を取得できます。
各ファイルのインスタンス数が必要な場合は、試してみてください。
grep -rc regex * | grep -v ":0$"