私はたくさんのログファイルを持っています。すべてのファイルで文字列が何回出現するかを調べる必要があります。
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
が返ってきたら、取り戻したいです。)
cat * | grep -c string
これは、1行に複数回出現する場合に機能します。
grep -o string * | wc -l
grep -oh string * | wc -w
1行に複数回出現する場合
-cを使用する代わりに、wc -lにパイプするだけです。
grep string * | wc -l
これは各行を単一行にリストしてから行数を数えます。
ただし、これは文字列が1行に2回以上現れるインスタンスを見逃します。
cat * | grep -c string
cat
の稀な便利なアプリケーションのひとつ。
前のすべての答えとは異なる何か
Perl -lne '$count++ for m/<pattern>/g;END{print $count}' *
-R
を追加して再帰的に検索し(catを使用しないように)、-I
をバイナリファイルを無視するために追加できます。
grep -RIc string .
必須のAWKソリューション:
grep -c string * | awk 'BEGIN{FS=":"}{x+=$2}END{print x}'
ただし、ファイル名に ":"が含まれている場合は注意してください。
コロンを含むファイル名も処理するAWKソリューション:
grep -c string * | sed -r 's/^.*://' | awk 'BEGIN{}{x+=$1}END{print x}'
この方法でも、同じ行に複数のstring
が見つかることはありませんことはありませんことに注意してください。
ファイルごとの出現回数が必要な場合(文字列 "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
単純にgrep
を使って出現回数を効果的に捉えることができます。 -i
を正しくキャプチャするためにSTRING/StrING/string
オプションを使用します。
ファイル名を与えるコマンドライン:
grep -oci string * | grep -v :0
発生しないファイルがある場合は、ファイル名を削除して0を出力するコマンドライン。
grep -ochi string *
短い再帰的バリアント:
find . -type f -exec cat {} + | grep -c 'string'
私が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に戻し、同じパターンを使用して出現回数を数えます。
これは、ディレクトリ内のXMLファイルのコレクション内で、1行に複数の<url>
の一致を処理する、grepより速いAWKの代替方法です。
awk '/<url>/{m=gsub("<url>","");total+=m}END{print total}' some_directory/*.xml
一部のXMLファイルに改行が含まれていない場合は、これはうまく機能します。
行ごとに複数のオカレンスを処理する基本的なコマンドライン関数を使用する別のoneliner。
cat * |sed s/string/\\\nstring\ /g |grep string |wc -l