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 -q
Switch, aber das würde die gesamte Ausgabe unterdrücken, was ich nicht will.
Wie mache ich das?
grep
sollten Dateinamen nicht übereinstimmender Dateien nicht ausgedruckt werden. Eigentlich sieht es so aus,grep
als würde eine Zeile mit dem Inhalt0
übereinstimmen. Können Sie das genaue Suchmuster veröffentlichen, das Sie verwenden?grep 'delete' * -R
, aber ich glaube nicht, dass-R
es Probleme gibt. Und ja, normalerweise werden die nicht übereinstimmenden nicht gedruckt, aber nicht sicher, was hier der Fall ist ...grep -- 'delete' *
(hinzugefügt--
) und es hat wie erwartet funktioniert. Das Entfernen von--
führt zur obigen Anzeige.-ci
. Vielen Dank, dass Sie das Problem behoben haben. Sie können dieses Szenario als Antwort veröffentlichen.Antworten:
Das ist das Verhalten von
grep -c
.Wahrscheinlich haben Sie eine Datei, deren Name mit
-
einemc
Zeichen beginnt und ein Zeichen enthält , und Sie verwenden GNU grep, ohne diePOSIXLY_CORRECT
Umgebungsvariable festzulegen.Benutzen:
oder besser:
--
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 dasdelete
Argument ohne Option das Ende von Optionen markiert hätte), aber das Problem von wird nicht behoben eine Datei namens-
. Dasgrep 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).quelle
Hinzufügen
Nicht sehr elegant, aber ich denke, es wird den Job machen.
Wenn Sie
-l
Ihrem Befehl hinzufügen, erhalten Sie nur Übereinstimmungen, aber es wird auch das Drucken der Anzahl der Übereinstimmungen für jede Datei unterdrückt.quelle
-l
hat funktioniert. Die Umgehung ist auch gut. Dankegrep -v ':0$'
so sein, dass nur die am Ende einer Zeile übereinstimmen (dergrep -l
Ansatz ist jedoch weitaus besser, solange Sie keine Zeilenanzahl benötigen)Wenn
grep -l
Sie 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
-c
dem die Anzahl der Übereinstimmungen in einer Datei gezählt wird.edit: Und wie der Hexenmeister sagte,
-I
könnte es auch eine gute Idee sein, Übereinstimmungen in Binärdateien zu unterdrücken.quelle
Wie man ungleich Null zählt:
grep -rIcH 'string' . | grep -v ':0$'
-r
Rekursive Unterverzeichnisse.-I
Ignoriere Binärdateien (danke @tongpu , Hexenmeister) .-c
Anzahl 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.)
quelle
Ähnlich wie in Laurentius Antwort können Sie auch die Auflistung von
-l
als 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
quelle