grep wie unterdrückt man die Anzeige von nicht übereinstimmenden Dateien?

11

Ich versuche mit, Dateien zu finden, die ein bestimmtes Wort enthalten grep. Es gibt viele Dateien im Verzeichnis (> 500)

Befehl, den ich ausführe

$ grep 'delete' *

Ausgabe

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

Dies sind die Dateien, die nicht die angegebene Übereinstimmung enthalten. Ich möchte verhindern, dass diese Zeilen in stdout angezeigt werden. Ich kenne -qSwitch, aber das würde die gesamte Ausgabe unterdrücken, was ich nicht will.

Wie mache ich das?

mtk
quelle
2
Normalerweise grepsollten Dateinamen nicht übereinstimmender Dateien nicht ausgedruckt werden. Eigentlich sieht es so aus, grepals würde eine Zeile mit dem Inhalt 0übereinstimmen. Können Sie das genaue Suchmuster veröffentlichen, das Sie verwenden?
Adrian Heine
Das vollständige grep cmd, das ich verwendet habe, war grep 'delete' * -R, aber ich glaube nicht, dass -Res Probleme gibt. Und ja, normalerweise werden die nicht übereinstimmenden nicht gedruckt, aber nicht sicher, was hier der Fall ist ...
MTK
@step @everyone .. Seltsam ... Nachdem ich den bearbeiteten Beitrag oben gesehen habe. Ich habe es versucht grep -- 'delete' *(hinzugefügt --) und es hat wie erwartet funktioniert. Das Entfernen von --führt zur obigen Anzeige.
MTK
1
@Stephane In der Tat sind Sie richtig. Ich habe das Verzeichnis durchsucht ... und es gab eine Datei mit Namen -ci. Vielen Dank, dass Sie das Problem behoben haben. Sie können dieses Szenario als Antwort veröffentlichen.
MTK

Antworten:

9

Das ist das Verhalten von grep -c.

Wahrscheinlich haben Sie eine Datei, deren Name mit -einem cZeichen beginnt und ein Zeichen enthält , und Sie verwenden GNU grep, ohne die POSIXLY_CORRECTUmgebungsvariable festzulegen.

Benutzen:

grep -- delete *

oder besser:

grep delete ./*

--markiert das Ende von Optionen, so dass dieser Dateiname nicht als Option betrachtet wird (bei einem POSIX-Grep würde dies nicht der Fall sein, da das deleteArgument ohne Option das Ende von Optionen markiert hätte), aber das Problem von wird nicht behoben eine Datei namens -. Das grep delete ./*ist robuster, hat aber den Nachteil, dass das Extra ./für übereinstimmende Dateien ausgegeben wird (obwohl dies als Bonus angesehen werden kann, da dies bei der Identifizierung von Dateinamen hilft, die Zeilenumbrüche enthalten).

Stéphane Chazelas
quelle
12

Hinzufügen

| grep -v ':0$'

Nicht sehr elegant, aber ich denke, es wird den Job machen.

Wenn Sie -lIhrem Befehl hinzufügen, erhalten Sie nur Übereinstimmungen, aber es wird auch das Drucken der Anzahl der Übereinstimmungen für jede Datei unterdrückt.

Laurentiu Roescu
quelle
1
-lhat funktioniert. Die Umgehung ist auch gut. Danke
mtk
4
Die grep-Zeile sollte grep -v ':0$'so sein, dass nur die am Ende einer Zeile übereinstimmen (der grep -lAnsatz ist jedoch weitaus besser, solange Sie keine Zeilenanzahl benötigen)
mreithub
9

Wenn grep -lSie verwenden, erhalten Sie nur die Dateien, die mindestens eine Übereinstimmung enthalten.

Benötigen Sie Informationen darüber, wie viele Übereinstimmungen überhaupt in einer Datei enthalten sind? Denn das können Sie überspringen, mit -cdem die Anzahl der Übereinstimmungen in einer Datei gezählt wird.

edit: Und wie der Hexenmeister sagte, -Ikönnte es auch eine gute Idee sein, Übereinstimmungen in Binärdateien zu unterdrücken.

Tongpu
quelle
0

Wie man ungleich Null zählt:

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

  • -r Rekursive Unterverzeichnisse.
  • -IIgnoriere Binärdateien (danke @tongpu , Hexenmeister) .
  • -cAnzahl der Übereinstimmungen anzeigen. Ärgerlicherweise enthält 0-Count-Dateien.
  • -H Dateinamen anzeigen, auch wenn nur eine Datei vorhanden ist.
  • 'string' Ihre Saite geht hier.
  • . Beginnen Sie mit dem aktuellen Verzeichnis.
  • | -v ':0$'Entfernen Sie 0-Count-Dateien. (danke @LaurentiuRoescu )

(Mir ist klar, dass das OP unbeabsichtigt gezählt wurde, aber Google (grep nonzero count) landet hier.)

Bob Stein
quelle
0

Ähnlich wie in Laurentius Antwort können Sie auch die Auflistung von -lals Dateieingaben für grep verwenden:
grep -r "pattern" -c $(grep -rl "pattern")
Sie ermöglicht das Beibehalten der Farbe von grep, führt jedoch dasselbe im Hintergrund aus

adriel
quelle
Beachten Sie, dass Dateinamen und Verzeichnisse, die Leerzeichen oder Platzhalter enthalten, fälschlicherweise aufgeteilt und abgeglichen werden.
Jeff Schaller