Ich brauche einen egrep-Befehl, der alle Dateinamen auflistet, die die Wörter enthalten + die gefundene Zeichenfolge. Stellen wir uns dieses Szenario vor:
Wörter, die ich finden muss: apple
, watermelon
und banana
.
Was ich brauche: Ich möchte alle Dateien auflisten, die eines dieser Wörter enthalten (es müssen nicht alle in derselben Datei sein) und das in der Datei gefundene Wort ausdrucken. Beispiel für ein Suchergebnis, das ich möchte:
./file1.txt:apple
./file1.txt:banana
./file2.txt:watermelon
./file5.txt:apple
Ich erinnere mich, dass in den Suchergebnissen ein grep
Befehl angezeigt wurde , aber ich kann mich nicht erinnern, wie er ausgeführt wurde. Ich habe Folgendes versucht:FILENAME:STRING
egrep -lr 'apple|banana|watermelon' .
Aber die Suchergebnisse zeigten:
./file1.txt
./file2.txt
Ok, es hilft, aber ... in file1
welchem der Wörter wurde es gefunden? Das ist das Problem, mit dem ich konfrontiert bin.
Antwort1
Sie haben verwendet -l
, was das Gegenteil von dem ist, was Sie wollen. Vonman grep
:
-l, --files-with-matches
Suppress normal output; instead print the name of each input
file from which output would normally have been printed. The
scanning will stop on the first match. (-l is specified by
POSIX.)
Was Sie wollen, ist -H
:
-H, --with-filename
Print the file name for each match. This is the default when
there is more than one file to search.
Aber das ist sowieso die Standardeinstellung. Führen Sie einfach Folgendes aus:
grep -Er 'apple|banana|watermelon' .
(Das -E
sagt mir grep
, wie ich mich verhalten soll egrep
.)
Antwort2
So geht's mit awk:
awk -v var1=apple -v var2=banana -v var3=watermelon '{ if($0~var1) {print FILENAME":"var1} ; if($0~var2) {print FILENAME":"var2} ; if($0~var3) {print FILENAME":"var3} }' *
Deklarieren Sie grundsätzlich 3 Variablen und 3 if-Anweisungen, um den Dateinamen und die entsprechende gefundene Variable auszudrucken
BEARBEITEN
Kürzere Version:
awk '/watermelon/{ print FILENAME":watermelon" }; /banana/{print FILENAME":banana"}; /apple/ {print FILENAME":apple"}' *
Die Grundidee besteht darin, /regular expression/
Code in geschweiften Klammern zu suchen und auszuführen, sofern er gefunden wurde (das heißt, den DATEINAMEN und die gefundene Zeichenfolge auszudrucken).
Antwort3
Hier ist der Befehl, nach dem Sie suchen:
grep -R "apple\|banana\|watermelon" <search_path>
Mit -R werden alle Dateien in jedem Verzeichnis gelesen.Suchpfad, rekursiv. Bei jeder Übereinstimmung wird der Dateiname angezeigt.
Antwort4
Folgendes gibt Ihnen die gewünschte Ausgabe (mit Bash):
for x in apple banana watermelon ; do grep $x * ; done
Als Ausgabe erhalten Sie alle Zeilen, die den Suchbegriff enthalten.
Im Folgenden erhalten Sie nur die Suchzeichenfolge als Ausgabe:
for x in apple banana watermelon ; do grep -l $x * |xargs -I{} echo {}:$x; done