web-dev-qa-db-ja.com

grep一致しないファイルの表示を抑制する方法は?

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スイッチ、しかしそれは私が望まない完全な出力を抑制するでしょう。

それ、どうやったら出来るの?

11
mtk

それがgrep -cが示す動作です。

おそらく、名前が-で始まり、c文字を含むファイルがあり、POSIXLY_CORRECT環境変数を設定せずにGNU grepを使用している。

使用する:

grep -- delete *

以上:

grep delete ./*

--は、オプションの終わりをマークし、そのファイル名がオプションと見なされないようにします(POSIX grepでは、オプション以外のdelete引数がオプションの終わりをマークしていたため、 )、ただし-というファイルの問題は解決されません。 grep delete ./*はより堅牢ですが、一致するファイルに対して余分な./を出力するという欠点があります(ただし、改行文字を含むファイル名の識別に役立つため、これはボーナスと見なされる場合があります)。

9

追加

| grep -v ':0$'

あまりエレガントではありませんが、私は仕事をすると思います。

コマンドに-lを追加すると、一致のみが表示されますが、各ファイルの一致数の出力も抑制されます。

12

grep -lを使用すると、少なくとも1つの一致を含むファイルのみが取得されます。

ファイル内の一致の数に関する情報が必要ですか?ファイル内の一致数をカウントするために使用される-cの使用をスキップできるためです。

編集:そして、ウォーロックが言ったように、バイナリファイルでの一致を抑制するために-Iを使用することも良い考えです。

9
tongpu

Laurentiuの回答と同様に、_-l_のリストをgrepのファイル入力として使用することもできます。
grep -r "pattern" -c $(grep -rl "pattern")
grepのカラーリングを維持できますが、バックグラウンドで同じことを行います

0
adriel

ゼロ以外のカウントを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)がここに表示されます。)

0
Bob Stein