web-dev-qa-db-ja.com

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

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

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が返ってきたら、取り戻したいです。)

280
Željko Filipin
cat * | grep -c string
284
Bombe

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

grep -o string * | wc -l
288
Jeremy Lavine
grep -oh string * | wc -w

1行に複数回出現する場合

27
Kaofu

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

grep string * | wc -l

これは各行を単一行にリストしてから行数を数えます。

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

20
Michael Haren
cat * | grep -c string

catの稀な便利なアプリケーションのひとつ。

15
Joachim Sauer

前のすべての答えとは異なる何か

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

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

grep -RIc string .
7
azmeuk

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

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

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

6
mumrah

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

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

この方法でも、同じ行に複数のstringが見つかることはありませんことはありませんことに注意してください。

5
Kreuvf

ファイルごとの出現回数が必要な場合(文字列 "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
4
Andriy Makukha

単純にgrepを使って出現回数を効果的に捉えることができます。 -iを正しくキャプチャするためにSTRING/StrING/stringオプションを使用します。

ファイル名を与えるコマンドライン:

grep -oci string * | grep -v :0

発生しないファイルがある場合は、ファイル名を削除して0を出力するコマンドライン。

grep -ochi string *
3
Mitul Patel

短い再帰的バリアント:

find . -type f -exec cat {} + | grep -c 'string'
2

私が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と一致する行の一部だけを表示する" - これが複数行の出現を単一の行に分割し、それぞれの一致を新しい行に印刷することになります。その後、それらの改行で区切られた結果を-cを使用してgrepに戻し、同じパターンを使用して出現回数を数えます。

1
Quantic

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

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

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

1
Excalibur

行ごとに複数のオカレンスを処理する基本的なコマンドライン関数を使用する別のoneliner。

 cat * |sed s/string/\\\nstring\ /g |grep string |wc -l
0
NTwoO