it-swarm.com.de

Suchen Sie nach Dateien, die einen bestimmten Text enthalten

In Bash möchte ich den Dateinamen (und den Pfad zur Datei) für jede Datei des Typs .php|.html|.js Zurückgeben, die die Zeichenfolge "document.cookie" | "setcookie" Enthält.

Wie würde ich das machen?

142
Owen
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .

Das r -Flag bedeutet, rekursiv zu suchen (Unterverzeichnisse durchsuchen). Das Flag i unterscheidet nicht zwischen Groß- und Kleinschreibung.

Wenn Sie nur Dateinamen möchten, fügen Sie das l (Kleinbuchstaben L) -Flag hinzu:

egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .
196
bear24rw

Versuchen Sie etwas wie grep -r -n -i --include="*.html *.php *.js" searchstrinhere .

mit -i wird die Groß- und Kleinschreibung ignoriert

das . am Ende bedeutet, dass Sie von Ihrem aktuellen Verzeichnis aus beginnen möchten. Dieses kann durch ein beliebiges Verzeichnis ersetzt werden.

das -r bedeutet, dass Sie dies rekursiv im gesamten Verzeichnisbaum tun müssen

das -n gibt die Zeilennummer für Übereinstimmungen aus.

mit --include können Sie Dateinamen und Erweiterungen hinzufügen. Platzhalter akzeptiert

Weitere Informationen finden Sie unter: http://www.gnu.org/software/grep/

46
Raoul

find sie und grep für die Zeichenfolge:

Dies findet alle Dateien Ihrer 3 Typen in/starting/path und grep für den regulären Ausdruck '(document\.cookie|setcookie)'. Mit dem Backslash auf 2 Zeilen aufteilen, um die Lesbarkeit zu verbessern ...

find /starting/path -type f -name "*.php" -o -name "*.html" -o -name "*.js" | \
 xargs egrep -i '(document\.cookie|setcookie)'
14

Klingt nach einem perfekten Job für grep oder vielleicht ack

Oder diese wunderbare Konstruktion:

find . -type f \( -name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null {} \;
9
Fredrik Pihl
find . -type f -name '*php' -o -name '*js' -o -name '*html' |\
xargs grep -liE 'document\.cookie|setcookie'
4
nos

Um nur eine weitere Alternative einzuschließen, können Sie auch Folgendes verwenden:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \;

Woher:

  • -regextype posix-extended Sagt find, welche Art von Regex zu erwarten ist
  • -regex "^.*\.(php|html|js)$" teilt find mit, dass die Dateinamen der Regex selbst übereinstimmen müssen
  • -exec grep -EH '(document\.cookie|setcookie)' {} \; weist find an, den Befehl (mit seinen Optionen und Argumenten) auszuführen, der zwischen der Option -exec und \; für jede gefundene Datei angegeben ist {} Gibt an, wohin der Dateipfad in diesem Befehl führt.

    während

    • Die Option E weist grep an, einen erweiterten regulären Ausdruck (zur Unterstützung der Klammern) zu verwenden und ...
    • Die Option H weist grep an, Dateipfade vor den Übereinstimmungen zu drucken.

Wenn Sie nur Dateipfade benötigen, können Sie vor diesem Hintergrund Folgendes verwenden:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \; | sed -r 's/(^.*):.*$/\1/' | sort -u

Woher

  • | [Pipe] Sende die Ausgabe von find zum nächsten Befehl danach (das ist sed, dann sort)
  • Die Option r weist sed an, erweiterten regulären Ausdruck zu verwenden.
  • s/HI/BYE/ Weist sed an, jedes erste Vorkommen (pro Zeile) von "HI" durch "BYE" zu ersetzen und ...
  • s/(^.*):.*$/\1/ weist es an, den regulären Ausdruck (^.*):.*$ zu ersetzen (dh ein group [von () eingeschlossenes Zeug] einschließlich alles [.* = ein oder mehrere beliebige Zeichen] ab dem Zeilenanfang [^] Bis 'das erste': 'gefolgt von irgendetwas bis' das Ende der Zeile [$]) durch das erste Gruppe [\1] des ersetzten regulären Ausdrucks.
  • u weist sort an, doppelte Einträge zu entfernen (nehmen Sie sort -u als optional).

... bei weitem nicht der eleganteste Weg. Wie ich bereits sagte, ist es meine Absicht, das Spektrum der Möglichkeiten zu erweitern (und auch ausführlichere Erklärungen zu einigen Tools zu geben, die Sie verwenden könnten).

3
Pedro Vernetti