grep - Listendateiname, in dem Übereinstimmung gefunden wird


31

Ich habe eine Reihe von .html-Dateien in einem Verzeichnis. Ich möchte jede Datei durchsehen und ein Muster (MD5) abgleichen. All das ist einfach genug. Das Problem ist, ich muss wissen, in welcher Datei die Übereinstimmung gefunden wurde.

cat *.html | grep 75447A831E943724DD2DE9959E72EE31

Gibt nur den Inhalt der HTML-Seite zurück, in der die Übereinstimmung gefunden wurde, aber nicht die Datei, in der sie gefunden wurde.


Der angegebene Vorschlag funktioniert wirklich nicht ... Ich erhalte nur die Standardeingabe cat * .html | grep -i -H 1ee024007823cc0bfbefba98ba1e1f4c (Standardeingabe): <html> <head> <title>
BeMy Friend

4
Sie verpassen den Punkt. Sie brauchen keine Katze zu benutzen. Die Katze verhindert, dass grep einzelne Dateien unterscheidet.
muru

Möglicherweise hat Ihnen dieser Beitrag zum Stapelüberlauf weitergeholfen .
Pablo A

Antworten:


32
grep -H 75447A831E943724DD2DE9959E72EE31 *.html

-H, --with-filename
              Print the file name for each match. This is
              the default when there is more than one file
              to search.

3
Wie es heißt, ist dies die Standardeinstellung für mehrere Dateien. Solange es mehr als eine HTML-Datei gibt, -Hist dies nicht erforderlich.
muru

1
Entschuldigung, meine Frage war anstößig. Ich hätte sagen sollen, dass ich eine Weile daran gearbeitet habe und eine Reihe von Schaltern verwendet habe UND die MAN-Seite gelesen habe, auf der der Dateiname standardmäßig aufgeführt ist ) wo es den Dateinamen auflisten soll.
BeMy Friend

und das ist nur, wenn ich den Schalter -H gebe. Wenn ich nur das tue, was ich im OP aufgelistet habe, dann liefert es keinen Dateinamen.
BeMy Friend

3
@BeMyFriend, das Problem ist cat. catbedeutet verketten. Wenn Sie alle Dateien zusammenfassen, bevor Sie sie übergeben grep, grepsehen Sie nur eine große Standardeingabedatei und können ( abgesehen von Wahrsagerei) keine Informationen über die einzelnen Dateien zurückgeben. Sehen?. Cyrus, was ist mit der Erklärung in der Antwort?
Rmano

OK, das Problem ist cat command, aber was kann eine Lösung sein?
Josef Klimuk

20

Ich benutze diese Option immer, um nach Dateien zu suchen, die eine Zeichenfolge enthalten, und zwar REKURSIV in einem Verzeichnis (das heißt, wenn ein beliebiger Unter-Unter-Ordner durchlaufen wird). grep -Ril "yoursearchtermhere"

  • R ist rekursiv zu suchen (folgende Symlinks)
  • i ist es, die Groß- und Kleinschreibung zu ignorieren
  • l ist nur um den Namen der Dateien aufzulisten.

Die Beantwortung Ihrer Frage reicht grep -l '75447A831E943724DD2DE9959E72EE31' *.htmlalso aus, aber Sie können einfach grep -Ril '75447A831E943724DD2DE9959E72EE31'in einer beliebigen Datei in einem beliebigen Unterordner nach dieser Zeichenfolge suchen, bei der die Groß- und Kleinschreibung nicht beachtet wird


Für macOS ist immer eine Dateidef erforderlich, möglicherweise ein Platzhalter. Andernfalls wird die Eingabe von stdin( grep: warning: rekursive Suche nach stdin vorausgesetzt , was auch immer rekursive stdin-Eingabe bedeuten würde :-). Mit anderen Worten:grep -Ril 'texttofind' *
Ville

grep -RiH 'pattern'zeigt Dateinamen und übereinstimmende Zeile
Ikrom

7

Sie können dies versuchen

grep -rl '75447A831E943724DD2DE9959E72EE31' * > found.txt

2
grep -r -H 75447A831E943724DD2DE9959E72EE31 *.html | awk -F : ' { print $1 } '

Als Alternative

grep -r -l 75447A831E943724DD2DE9959E72EE31 *.html

Wenn Sie dies tun, wird rekursiv in Ordnern und Unterordnern gesucht und der Pfad der Datei ausgegeben ...


grep -r -l ist das einzige, was mir geholfen hat.
Josef Klimuk

0

Die Antwort von Cyrus ist absolut richtig und lautet "The Right Way TM" , grepwenn wir nur Dateien finden müssen . Wenn Dateinamen zusätzliche Parsing- oder Operationen für die übereinstimmenden Dateinamen benötigen , können wir auf die Verwendung von whileloop with ifstatement zurückgreifen . Hier ist ein Beispiel, in dem die Liste der Dateinamen aus einer häufig verwendeten find+ whileStruktur zum sicheren Parsen von Dateinamen stammt.

find -type f -name "*.html" -print0 | while IFS= read -r -d '' filename
do
    if grep -q 'PATTERN' "$filename"
    then
        printf "%s found in %s\n" 'PATTERN' "$filename"
        # Here we can insert another command or function
        # to perform other operations on the filename
    fi
done

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.