316

たくさんのログファイルがあります。すべてのファイルで文字列が何回出現するかを調べる必要があります。

grep -c string *

戻り値

...
file1:1
file2:0
file3:0
...

パイプを使用して、1 つ以上のオカレンスを持つファイルのみを取得できました。

grep -c string * | grep -v :0

...
file4:5
file5:1
file6:2
...

合計数だけを取得するにはどうすればよいですか? ( が返っfile4:5, file5:1, file6:2てきたら 8 を返したい。)

4

16 に答える 16

313

これは、1行に複数回出現する場合に機能します。

grep -o string * | wc -l
于 2010-07-14T19:31:55.687 に答える
298
cat * | grep -c string
于 2008-12-16T12:17:21.993 に答える
29
grep -oh string * | wc -w

行内の複数の出現をカウントします

于 2013-02-27T07:40:33.363 に答える
26

-c を使用する代わりに、それを wc -l にパイプするだけです。

grep string * | wc -l

これにより、各出現箇所が 1 行にリストされ、行数がカウントされます。

ただし、これにより、文字列が 1 行に 2 回以上出現するインスタンスが見逃されます。

于 2008-12-16T12:15:58.377 に答える
18
cat * | grep -c string

のまれな便利なアプリケーションの 1 つですcat

于 2008-12-16T12:18:14.347 に答える
13

-R再帰的に検索する (そして cat を使用しないようにする) ことと-I、バイナリ ファイルを無視することを追加できます。

grep -RIc string .
于 2013-12-12T12:18:30.357 に答える
12

以前のすべての回答とは異なるもの:

perl -lne '$count++ for m/<pattern>/g;END{print $count}' *
于 2013-02-27T08:00:26.510 に答える
10

必須のAWKソリューション:

grep -c string * | awk 'BEGIN{FS=":"}{x+=$2}END{print x}'

ただし、ファイル名に「:」が含まれている場合は注意してください。

于 2011-09-29T12:26:37.380 に答える
7

コロンを含むファイル名も処理する AWK ソリューション:

grep -c string * | sed -r 's/^.*://' | awk 'BEGIN{}{x+=$1}END{print x}'

このメソッドは、同じ行で が複数回出現することはまだ検出できないことに注意してください。string

于 2013-01-25T20:07:35.510 に答える
5

簡単grepに使用して、発生数を効果的にキャプチャできます。-iこのオプションを使用して、STRING/StrING/string適切にキャプチャされるようにします。

ファイルの名前を指定するコマンド ライン:

grep -oci string * | grep -v :0

ファイル名を削除し、出現のないファイルがある場合は 0 を出力するコマンド ライン:

grep -ochi string *
于 2015-06-12T13:19:38.037 に答える
4

短い再帰​​バリアント:

find . -type f -exec cat {} + | grep -c 'string'
于 2017-07-17T16:25:39.247 に答える
2

<url>ディレクトリ内の XML ファイルのコレクション内で、行ごとに複数の一致を処理する、grep AWK よりも高速な代替方法を次に示します。

awk '/<url>/{m=gsub("<url>","");total+=m}END{print total}' some_directory/*.xml

これは、一部の XML ファイルに改行がない場合にうまく機能します。

于 2014-06-11T19:02:34.820 に答える
0

行ごとに複数の出現を処理する基本的なコマンドライン関数を使用する別のワンライナー。

 cat * |sed s/string/\\\nstring\ /g |grep string |wc -l
于 2014-01-23T16:26:55.803 に答える