Ich möchte Dateien finden, die zwei Zeichenfolgen zusammen enthalten, zum Beispiel enthält die Datei beide string1
und string2
.
Ich möchte den vollständigen Pfad der Dateien in der Ausgabe. Ich möchte keine Warnungen "Erlaubnis verweigert" sehen.
grep -l string2 `grep -l string1 /path/*`
das ist das gleiche wie
grep -l string2 $(grep -l string1 /path/*)
Edit: hier ist warum grep string1 /path/* | grep string2
nicht was ich denke alwbtc will.
$ cd /tmp
$ cat a
apples
oranges
bananas
$ cat b
apples
mangoes
lemons
$ cat c
mangoes
limes
pears
$ cd ~
$ grep apples /tmp/* | grep mangoes
$
Nichts gefunden, aber Datei b enthält beide Zeichenfolgen.
Hier ist, was ich denke, dass alwbtc will
$ grep -l apples $(grep -l mangoes /tmp/*)
/tmp/b
-l
Option, um die Dateinamen anstelle der Zeilen zurückzugeben. Er verwendet dann das Dollarzeichen oder die hinteren Anführungszeichen, um diese Liste alsFILE
Argument an den zweiten Grep zu übergeben. Auf diese Weise kann der zweite Grep die gesamte gefundene Datei anstelle der einzelnen Zeilen wie in meiner Lösung durchsuchen.-l
Option verpasst, bei der beide Befehle als gleich angesehen werden.Pfeife
grep
ineinander:grep "string1" /path/to/files/* | grep "string2"
quelle
Hier ist der äquivalente ack- Befehl zu RedGrittyBricks Antwort :
Funktioniert genauso (außer
ack
standardmäßig wird das aktuelle Verzeichnis rekursiv durchsucht). Der Inhalt innerhalb der$()
Suche nachstring1
aber-l
gibt nur die Dateinamen , wo die Zeichenfolge gefunden wurde. Sie werden dann als Argumente an den äußeren Befehl übergeben, dh, sie werden nur in dieser Dateilistestring2
gesucht.quelle
oder weniger redundant:
Dies funktioniert, wenn sich die Zeichenfolgen in verschiedenen Zeilen derselben Datei befinden, und vermeidet auch Fehlalarme, wenn ein Dateiname eine der Zeichenfolgen enthält.
quelle
Um auf die Lösung von @ RedGrittyBrick einzugehen, die ein Manko aufweist, wenn der Befehl unbeaufsichtigt ausgeführt wird, und um die Fehlerausgabe wie beabsichtigt zu unterdrücken und um Dateien rekursiv zu finden, die Sie möglicherweise in Betracht ziehen
grep -l 'STRING1' $(! grep -lrs 'STRING2' /absolute/path/to/search/dir && echo /dev/null)
-s
Option Fehlermeldungen unterdrücken-r
Option ermöglicht Strings in beliebig verschachtelten Verzeichnissen suchen!
kombiniert mit&& echo /dev/null
Garantien , dass der Befehl auf nicht hängen. Andernfalls gibt dasinner grep
Gerät keine Ausgabe aus , wenn es keine findet, sodassouter grep
es unbegrenzt auf die Eingabe wartet, nach der gesucht werden soll. Diese Lösung gibt/dev/null
in diesen Fällen soouter grep
wird die Suche nachSTRING1
in/dev/null
denen es angenommen hat , um nicht etwas zu finden.quelle
Ich suchte nach einer erweiterbaren Möglichkeit, zwei oder mehr Saiten zu spielen, und fand Folgendes:
Der erste grep findet rekursiv die Namen der Dateien enthält ,
string1
innerhalbpath-to-files
.Die Ergebnisse werden weitergeleitet, in
xargs
die ein oder mehrere grep-Befehle für diese Dateien ausgeführt werdenstring2
.Die Ergebnisse werden dann in einen anderen
xargs
Befehl für weitergeleitetstring3
- es ist dasselbe wie beim erstenxargs
Aufruf, aber es wird nach einer anderen Zeichenfolge gesucht.Durch die Verwendung von
xargs
werden Probleme vermieden, bei denen so viele Ergebnisse vorliegen, dass die resultierende Befehlszeile aus der Verwendung von Back-Ticks zu lang ist.Um die Warnungen zu vermeiden, können wir umleiten
stderr
zu/dev/null
:Es wird bei den nachfolgenden grep-Aufrufen nicht benötigt, da
string1
es bereits in der Datei gefunden wurde, sodass die Berechtigungen bekanntermaßen gut sind.quelle