grepを使用して、多数のファイル内の文字列の出現をすべてカウントする


289

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

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に戻します。)


1
grep -v:0の機能を教えてください。。オカレンスが0より大きいファイルについてもカウントされます。-vオプションと:0はどういう意味ですか?親切に私に知らせてください。
Gautham Honnavara

@GauthamHonnavara grep:0は、文字列:0に一致する行を探します。-vはその検索を反転するオプションなので、grepを使用する代わりに-v:0は、:0を含まないすべての行を検索することを意味します。 0
ペンギン359

スペースを使用して複数のファイルを選択できます。grep file1 file2 --options
Dnyaneshwar Harer

回答:


288
cat * | grep -c string

9
これには、1つの行で複数の発生を1回だけカウントするのと同じ制限があります。この場合でも、この動作は問題ないと思います。
Michael Haren

@Michael Harenはい、行に1つの文字列しか出現できません。
ジェリコ・フィリピン

2
私はむしろしたいgrep -c string<*ので、単にスペースを小なりに置き換えます。
JamesM-SiteGen、2012年

48
1行での複数の発生には対応していません
ブルースマン

2
これは、サブディレクトリも検索したい場合には機能しませんが、grep -oおよびwc -lは機能します。元の質問のような場合でも猫は速いです。
Leagsaidh Gordon 2013

296

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

grep -o string * | wc -l

2
これも機能しますgrep -o string * --exclude-dir=some/dir/one/ --exclude-dir=some/dir/two | wc -l
コーダー、2014年

2
grep -ioR string * | wc -l大文字と小文字を区別せず、再帰的で一致のみの検索を行うために使用するものです
LeonardChallis '28

2
この1番組、関連するファイルやマッチの総数:grep -rc test . | awk -F: '$NF > 0 {x+=$NF; $NF=""; print} END{print "Total:",x}'
ヤロン

28
grep -oh string * | wc -w

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


24
grep -oh "... my that curry was strong" * >> wc:)
icc97 2016年

23

-cを使用する代わりに、パイプでwc -lに渡します。

grep string * | wc -l

これは、1つの行の各出現をリストしてから、行数をカウントします。

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


2
「wc -l」へのパイピングは、「grep -r 'test'」と一緒にうまく機能します。現在のディレクトリの下のすべてのディレクトリにある文字列「test」のすべてのファイルを再帰的にスキャンします。
stevek


9

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

perl -lne '$count++ for m/<pattern>/g;END{print $count}' *

私のgrep(Windowsの場合)は-oオプションをサポートしていないため、grepを使用しないアプローチを見るのはうれしいです。
David Roussel 2013年

9

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

grep -RIc string .

7

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

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

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


5

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

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

この方法でも、同じ行にが複数出現することはありませstring


4

ファイルごとの出現回数が必要な場合(文字列 "tcp"の例):

grep -RIci "tcp" . | awk -v FS=":" -v OFS="\t" '$2>0 { print $2, $1 }' | sort -hr

出力例:

53  ./HTTPClient/src/HTTPClient.cpp
21  ./WiFi/src/WiFiSTA.cpp
19  ./WiFi/src/ETH.cpp
13  ./WiFi/src/WiFiAP.cpp
4   ./WiFi/src/WiFiClient.cpp
4   ./HTTPClient/src/HTTPClient.h
3   ./WiFi/src/WiFiGeneric.cpp
2   ./WiFi/examples/WiFiClientBasic/WiFiClientBasic.ino
2   ./WiFiClientSecure/src/ssl_client.cpp
1   ./WiFi/src/WiFiServer.cpp

説明:

  • grep -RIci NEEDLE . -バイナリを無視し、出現回数をカウントし、大文字と小文字を無視して、現在のディレクトリ(シンボリックリンクに従います)から再帰的に文字列NEEDLEを検索します
  • awk ... -このコマンドは、出現がゼロのファイルを無視し、行をフォーマットします
  • sort -hr -行を最初の列の数値で逆順にソートします

もちろん、オプション-c(count)を指定した他のgrepコマンドでも動作します。例えば:

grep -c "tcp" *.txt | awk -v FS=":" -v OFS="\t" '$2>0 { print $2, $1 }' | sort -hr

3

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

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

grep -oci string * | grep -v :0

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

grep -ochi string *

提供するソリューションについてもう少し説明を追加して、回答を詳しく説明していただけませんか?
abarisone 2015年


1

Windows用のgrepでテストしたGrepのみのソリューション:

grep -ro "pattern to find in files" "Directory to recursively search" | grep -c "pattern to find in files"

このソリューションは、1行に複数ある場合でも、すべての発生をカウントします。-rディレクトリを再帰的に検索し、-o「PATTERNに一致する行の一部のみを表示」します。これにより、複数の出現箇所が1行に分割され、grepが一致ごとに新しい行を出力します。次に、それらの改行で区切られた結果をgrepにパイプして戻し-c、同じパターンを使用して出現回数をカウントします。


1

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

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

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


0

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

 cat * |sed s/string/\\\nstring\ /g |grep string |wc -l
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.