grep
を使用して、特定のWordを含むファイルを検索しようとしています。ディレクトリに多くのファイルがあります(> 500)
$ grep 'delete' *
validate_data_stage1:0
validate_data_stage2:0
validate_data_stage3:0
validate_data_stage4:0
validate_data_stage5:0
validate_input_stage1:0
validate_input_stage2:0
validate_input_stage3:0
validate_input_stage4:0
.... and hundred of such lines
これらは、指定された一致を含まないファイルです。それらの行がstdoutに表示されないようにします。知っている-q
スイッチ、しかしそれは私が望まない完全な出力を抑制するでしょう。
それ、どうやったら出来るの?
それがgrep -c
が示す動作です。
おそらく、名前が-
で始まり、c
文字を含むファイルがあり、POSIXLY_CORRECT
環境変数を設定せずにGNU grepを使用している。
使用する:
grep -- delete *
以上:
grep delete ./*
--
は、オプションの終わりをマークし、そのファイル名がオプションと見なされないようにします(POSIX grepでは、オプション以外のdelete
引数がオプションの終わりをマークしていたため、 )、ただし-
というファイルの問題は解決されません。 grep delete ./*
はより堅牢ですが、一致するファイルに対して余分な./
を出力するという欠点があります(ただし、改行文字を含むファイル名の識別に役立つため、これはボーナスと見なされる場合があります)。
追加
| grep -v ':0$'
あまりエレガントではありませんが、私は仕事をすると思います。
コマンドに-l
を追加すると、一致のみが表示されますが、各ファイルの一致数の出力も抑制されます。
grep -l
を使用すると、少なくとも1つの一致を含むファイルのみが取得されます。
ファイル内の一致の数に関する情報が必要ですか?ファイル内の一致数をカウントするために使用される-c
の使用をスキップできるためです。
編集:そして、ウォーロックが言ったように、バイナリファイルでの一致を抑制するために-I
を使用することも良い考えです。
Laurentiuの回答と同様に、_-l
_のリストをgrepのファイル入力として使用することもできます。grep -r "pattern" -c $(grep -rl "pattern")
grepのカラーリングを維持できますが、バックグラウンドで同じことを行います
grep -rIcH 'string' . | grep -v ':0$'
-r
再帰サブディレクトリ。-I
バイナリファイルを無視する (ありがとう @ tongp 、ウォーロック)。-c
一致の数を表示します。厄介なことに、0カウントのファイルが含まれています。-H
ファイルが1つしかない場合でも、ファイル名を表示します。'string'
ここに文字列を入力します。.
現在のディレクトリから開始します。| -v ':0$'
0カウントファイルを削除します。 (ありがとう @ LaurentiuRoesc )(私はOPが意図せずに-cカウントしていたことを認識していますが、google(grep nonzero count)がここに表示されます。)