Wie benutze ich den "grep" -Befehl, um Text einschließlich Unterverzeichnissen zu finden

286

Ich möchte alle Dateien finden, die eine bestimmte Textfolge enthalten. Der Befehl grep funktioniert, aber ich weiß nicht, wie ich ihn für jedes Verzeichnis verwenden soll (ich kann das nur für mein aktuelles Verzeichnis tun). Ich habe versucht, man grep zu lesen, aber es ergab keine Hilfe.

    
Smile.Hunter 01.08.2011, 13:38

11 Antworten

370

Es wäre besser,

zu verwenden
grep -rl "string" /path

wo

  • Mit der Option -r (oder --recursive ) werden auch alle Unterverzeichnisse von /path durchlaufen, während
  • Die Option -l (oder --files-with-matches ) wird verwendet, um nur die Dateinamen übereinstimmender Dateien und nicht die übereinstimmenden Zeilen zu drucken (dies könnte auch die Geschwindigkeit verbessern, da grep das Lesen einer Datei bei der ersten Übereinstimmung mit dieser Option stoppt).
enzotib 01.08.2011, 13:55
135

Wenn Sie nach Zeilen suchen, die in Dateien übereinstimmen, lautet mein bevorzugter Befehl:

grep -Hrn 'search term' path/to/files
  • -H bewirkt, dass der Dateiname gedruckt wird (impliziert, wenn mehrere Dateien durchsucht werden)
  • -r führt eine rekursive Suche durch
  • -n bewirkt, dass die Zeilennummer gedruckt wird

path/to/files kann . sein, um im aktuellen Verzeichnis zu suchen

Weitere Optionen, die ich sehr nützlich finde:

  • -I ignoriert Binärdateien (Ergänzung: -a behandelt alle Dateien als Text)
  • -F treat search term als Literal, kein regulärer Ausdruck
  • -i führt eine Suche ohne Beachtung der Groß- und Kleinschreibung durch
  • --color=always , um Farben zu erzwingen, selbst wenn Sie durch less gehen. Um less support Farben zu erstellen, müssen Sie die Option -r verwenden:

    grep -Hrn search . | less -r
    
  • --exclude-dir=dir nützlich zum Ausschließen von Verzeichnissen wie .svn und .git .

    
Lekensteyn 01.08.2011 14:27
21

Ich glaube, Sie können so etwas verwenden:

find /path -type f -exec grep -l "string" {} \;

Erklärung von Kommentaren

find ist ein Befehl, mit dem Sie Dateien und andere Objekte wie Verzeichnisse und Links in Unterverzeichnissen eines bestimmten Pfads finden können. Wenn Sie keine Maske angeben, die Dateinamen erfüllen sollen, listet sie alle Verzeichnisobjekte auf.

  • -type f gibt an, dass nur Dateien verarbeitet werden sollen, keine Verzeichnisse usw.
  • -exec grep gibt an, dass für jede gefundene Datei der Befehl grep ausgeführt und der Dateiname als Argument übergeben werden soll, indem {} durch den Dateinamen
  • ersetzt wird
dmityugov 01.08.2011 13:48
17

Mein Standardbefehl ist

grep -Rin string *

Ich benutze ein Capitol 'R', weil ls es für rekursive verwendet. Da grep beides akzeptiert, gibt es keinen Grund, es nicht zu benutzen.

BEARBEITEN: pro HVNSweeting scheint -R Symlinks zu folgen, wo -r nicht geht.

    
user606723 01.08.2011 16:43
11

Wenn Sie etwas Neues ausprobieren möchten, geben Sie ack eine Einstellung. Der Befehl zum rekursiven Durchsuchen des aktuellen Verzeichnisses nach string lautet:

ack string

Die Installation ist ziemlich einfach:

curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3

(Vorausgesetzt, Sie haben bereits das Verzeichnis ~/bin und es ist vorzugsweise in Ihrem PATH .)

    
Konrad Rudolph 01.08.2011 17:09
3

Der Befehl rgrep ist für diesen Bedarf bestimmt

Wenn nicht verfügbar, können Sie es so erhalten

mkdir -p ~/bin
cd ~/bin
wget http://sdjf.esmartdesign.com/files/rgrep
chmod +x rgrep

Sie können direkt in Ihre Standard-Grep-Optionen wie oben beschrieben setzen.

Ich persönlich benutze

[[  ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"
args="${args:--Hns} --color=auto"

verwandtes Thema: wie rgrep immer mit Farbe verwendet wird

    
mnono 02.01.2015 14:58
2

Update 2:

Diese Befehlszeile mit find und grep behebt das Problem:

$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +

--color=<always or auto> für farbige Ausgabe:

$ find path_to_search_in -type f \
            -exec grep --color=always -in searchString {} 2>/dev/null +

Beispiel:

$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +

Ein Beispiel im folgenden Snapshot:

Update 1:

Sie können den folgenden Code ausprobieren; als Funktion in Ihrem .bashrc oder .bash_aliases oder in einem Skript:

wherein () 
{ 
    for i in $(find "" -type f 2> /dev/null);
    do
        if grep --color=auto -i "" "$i" 2> /dev/null; then
            echo -e "3[0;32mFound in: $i 3[0m\n";
        fi;
    done
}

Verwendung: wherein /path/to/search/in/ searchkeyword

Beispiel:

$ wherein ~/Documents/ "hello world"

(Hinweis: Wie in den Kommentaren von @enzotib empfohlen, funktioniert dies nicht mit Dateien / Verzeichnissen, einschließlich Leerzeichen in ihren Namen.)

Ursprünglicher Beitrag

Um nach der Zeichenfolge zu suchen und nur diese Zeile mit der Suchzeichenfolge auszugeben:

$ for i in $(find /path/of/target/directory -type f); do \
    grep -i "the string to look for" "$i"; done

z.B.:

$ for i in $(find /usr/share/applications -type f); \
    do grep -i "web browser" "$i"; done

Um den Dateinamen anzuzeigen, der die Suchzeichenfolge enthält:

$ for i in $(find /path/of/target/directory -type f); do \
    if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;

z.B.:

$ for i in $(find /usr/share/applications -type f); \
    do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
    fi; done;
    
precise 25.01.2014 12:11
1

Ich mache das mit xargs, einem sehr unterschätzten Befehl

find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'

find ./ gibt Ihnen eine rekursive Liste aller Dateien in einem aktuellen Ordner Dann pipen Sie es nach xargs, das den Befehl grep für jede dieser Dateien ausführt

    
deadprogrammer 01.08.2011 17:30
0

Ich weiß, dass es hier viele Antworten gibt, aber hier ist eine Alternative, wenn Sie beim Durchsuchen der Dateien andere Einschränkungen hinzufügen möchten:

find . -type f -exec grep --quiet string_to_look_for {} ';' -print

Das funktioniert, weil grep 0 zurückgibt, wenn es ein Ergebnis gefunden hat, sonst 1. Zum Beispiel können Sie Dateien finden 1 MB groß und mit etwas:

find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print

Bei mehreren Anforderungen möchten Sie wahrscheinlich das Optimizer-Flag -O verwenden, das in GNU grep existiert.

    
Ztyx 11.03.2015 14:56
0

Ein Skript (find-in-code) zum Suchen in C, CPP-Code:

#!/bin/sh

find . \( -iname "*.c" -o -iname "*.cpp" -o -iname "*.h" \) -type f -print0 | xargs -0 grep --color -n ""

Verwenden:

find-in-code "search string"
    
nvd 11.06.2015 18:49
0

grep ( GNU oder BSD )

Sie können das Werkzeug grep verwenden, um rekursiv den aktuellen Ordner mit -r -Parameter zu suchen, wie zB:

grep -r "pattern" .

Hinweis: -r - Untersucht rekursiv Unterverzeichnisse.

Um in bestimmten Dateien zu suchen, können Sie eine Globbing-Syntax verwenden, zum Beispiel:

grep "class foo" **/*.c

Hinweis: Durch die Verwendung der Globbing-Option ( ** ), Es scannt alle Dateien rekursiv mit einer bestimmten Erweiterung oder einem bestimmten Muster. Um diese Syntax zu aktivieren, führen Sie Folgendes aus: shopt -s globstar . Sie können auch **/*.* für verwenden alle Dateien (ausgenommen versteckte und ohne Erweiterung) oder andere Muster.

Wenn Sie den Fehler haben, dass Ihr Argument zu lang ist, sollten Sie Ihre Suche eingrenzen oder stattdessen find syntax verwenden wie:

find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

Alternativ verwenden Sie ripgrep .

ripgrep

Wenn Sie an größeren Projekten oder großen Dateien arbeiten, sollten Sie stattdessen ripgrep verwenden, wie:

rg "pattern" .

Überprüfen Sie die Dokumentation, die Installationsschritte oder den Quellcode auf der GitHub-Projektseite .

>

Es ist viel schneller als jedes andere Tool wie GNU / BSD grep , ucg , ag , sift , ack , pt oder ähnlich, da es auf Ruts Regex aufgebaut ist Engine , die endliche Automaten, SIMD und aggressive wörtliche Optimierungen verwendet, um die Suche sehr schnell zu machen.

Es unterstützt Ignoriermuster, die in .gitignore -Dateien angegeben sind, so dass ein einzelner Dateipfad gleichzeitig mit mehreren Glob-Mustern verglichen werden kann.

Sie können die allgemeinen Parameter verwenden wie:

  • -i - Unsensitive Suche.
  • -I - Ignoriere die Binärdateien.
  • -w - Sucht nach den ganzen Wörtern (im Gegensatz zum partiellen Wortvergleich).
  • -n - Zeigt die Zeile Ihres Spiels an.
  • -C / --context (z. B. -C5 ) - Erhöht den Kontext, so dass Sie den umgebenden Code sehen.
  • --color=auto - Markieren Sie den passenden Text.
  • -H - Zeigt den Dateinamen an, in dem der Text gefunden wird.
  • -c - Zeigt die Anzahl der übereinstimmenden Zeilen an. Kann mit -H kombiniert werden.
kenorb 11.04.2018 13:21

Tags und Links