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


11

を使用して特定の単語を含むファイルを検索しようとしていますgrep。ディレクトリに多くのファイルがあります(> 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スイッチを知っていますが、それは完全な出力を抑制します。

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


2
通常、grep一致しないファイルのファイル名は出力されません。実際にgrepは、内容0が一致する行が考慮されているように見えます。使用している正確な検索パターンを投稿できますか?
エイドリアンハイネ

私が使用した完全なgrep cmdはでしたがgrep 'delete' * -R-R問題を引き起こしているとは思いません。そして、はい、それは通常、一致しないものを印刷しませんが、ここで何が起こっているのか
わかり

@step @everyone ..奇妙な...上記の編集された投稿を見た後。私は試しましたgrep -- 'delete' *(追加しました--)と期待どおりに動作しました。を削除する--と、上記の表示になります。
mtk

1
@Stephane確かにあなたは正しい。dir ...を検索したところ、という名前のファイルがありました-ci。問題を解決していただきありがとうございます。このシナリオを回答として投稿できます。
mtk

回答:


9

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

おそらくあなたは、その名前で始まるファイル持っている-と含まれているc文字を、あなたは設定せずにGNUのgrepのを使用しているPOSIXLY_CORRECT環境変数を。

使用する:

grep -- delete *

以上:

grep delete ./*

--オプションの終わりをマークして、そのファイル名がオプションと見なされないようにします(POSIX grepでは、非オプションdelete引数がオプションの終わりをマークしていたため、そうではありません)。しかし、それは、というファイル-grep delete ./*より堅牢ですが、余分を出力するという欠点がある./(つまり、改行文字を含むファイル名を特定するのに役立ちますので、それはボーナス考えてもよいが)一致するファイルのために。


12

追加

| grep -v ':0$'

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

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


1
-l働いた。回避策も良いです。ありがとう
mtk

4
grep行は行grep -v ':0$'の最後の行のみが一致grep -lするようにする必要があります(ただし、行数が必要でない限り、アプローチははるかに優れています)
mreithub

9

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

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

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


0

ゼロ以外のカウントをgrepする方法:

grep -rIcH 'string' . | grep -v ':0$'

  • -r 再帰サブディレクトリ。
  • -Iバイナリファイルを無視します@ tongpu、warlockに感謝)
  • -c一致数を表示します。厄介なことに、0カウントのファイルが含まれています。
  • -H ファイルが1つしかない場合でも、ファイル名を表示します。
  • 'string' ここに文字列が入ります。
  • . 現在のディレクトリから開始します。
  • | -v ':0$'0カウントファイルを削除します。@LaurentiuRoescuに感謝)

(私はOPが意図せず-cカウントであったことを理解していますが、google(grep nonzero count)がここに表示されます。)


0

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


空白やワイルドカードを含むファイル名とディレクトリは、誤って分割され、結果として一致することに注意してください。
ジェフシャラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.