Grep zeigt den Dateinamen und die gefundene Zeichenfolge an

Grep zeigt den Dateinamen und die gefundene Zeichenfolge an

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, watermelonund 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 grepBefehl 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 file1welchem ​​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 -Esagt 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

verwandte Informationen