Wie kann ich mit grep ein Wort in einem Ordner finden?

542

In Windows hätte ich nach einem Wort in einem Ordner gesucht. Ebenso möchte ich wissen, ob ein bestimmtes Wort in einem Verzeichnis vorkommt, das viele Unterverzeichnisse und Dateien enthält. Meine Suche nach grep-Syntax zeigt, dass ich den Dateinamen angeben muss, dh grep string filename.

Jetzt kenne ich den Dateinamen nicht. Was mache ich also? Ein Freund schlug vor, dies zu tun grep -nr string, aber ich weiß nicht, was dies bedeutet, und ich habe keine Ergebnisse damit erzielt (es gibt keine Antwort, bis ich a herausgebe ctrl + c).

kiki
quelle

Antworten:

848
grep -nr 'yourString*' .

Der Punkt am Ende durchsucht das aktuelle Verzeichnis. Bedeutung für jeden Parameter:

-n            Show relative line number in the file
'yourString*' String for search, followed by a wildcard character
-r            Recursively search subdirectories listed
.             Directory for search (current directory)

grep -nr 'MobileAppSer*' . (Würde finden MobileAppServlet.javaoder MobileAppServlet.classoder MobileAppServlet.txt; 'MobileAppASer*.*'ist eine andere Möglichkeit, das Gleiche zu tun.)

Um weitere Parameter zu überprüfen, verwenden Sie den Befehl man grep .

Manish Ranjan
quelle
14
Was ist das Geschäft mit *? Dies führt entweder zu einer Shell-Platzhaltererweiterung (wenn Dateinamen vorhanden sind, die mit dem Platzhaltermuster übereinstimmen), oder grep verwendet sie als 0-oder mehr-Wiederholungsoperator für das vorhergehende Zeichen *.
usta
7
Betrachten wir nun wir beide Möglichkeiten für grep -nr MobileAppSer* .1. Angenommen , wir haben 3 - Dateien im aktuellen Verzeichnis Anpassungs MobileAppSer*Wildcard Muster: Namen MobileAppServlet.java, MobileAppServlet.class, MobileAppServlet.txt. Dann grepwird wie folgt aufgerufen : grep -nr MobileAppServlet.class MobileAppServlet.java MobileAppServlet.txt .. Dies bedeutet, dass in den Dateien MobileAppServlet.java, MobileAppServlet.txt und an anderer Stelle im aktuellen Verzeichnis nach dem Text "MobileAppServlet.class" gesucht wird - was der Benutzer hier sicherlich nicht möchte.
Usta
7
2. Falls sich im aktuellen Verzeichnis keine Dateien befinden, die dem MobileAppSer*Platzhaltermuster entsprechen, grepwird das Argument unverändert empfangen MobileAppSer*und somit als Suche nach dem Text "MobileAppSe" gefolgt von 0 oder mehr Vorkommen von "r" verwendet Versuchen Sie, die Texte "MobileAppSe", "MobileAppSer", "MobileAppSerr", "MobileAppSerrr" usw. im Dateiinhalt des aktuellen Verzeichnisses zu finden - auch nicht das, was der Benutzer möchte.
usta
5
Dies ist eine zweifelhafte Wahl von Regex. Usta hat darauf hingewiesen.
bisschen einfach
117
grep -nr string my_directory

Zusätzliche Hinweise: Dies entspricht der Syntax, grep [options] string filenameda in Unix-ähnlichen Systemen ein Verzeichnis eine Art Datei ist (es gibt einen Begriff "reguläre Datei", der sich speziell auf Entitäten bezieht, die in Windows nur "Dateien" genannt werden).

grep -nr string Liest den zu durchsuchenden Inhalt von der Standardeingabe. Deshalb wartet er dort nur auf Eingaben von Ihnen und hört damit auf, wenn Sie ^ C drücken (dies würde auch bei ^ D aufhören, was die Tastenkombination für das Ende von ist -Datei).

usta
quelle
1
Hey, wenn ich unabhängig vom Fall nach einer Zeichenfolge suchen möchte, muss ich Folgendes tun: grep -i -nr "mein Wort".
Kiki
2
@kiki: Ja, das entsprichtgrep -inr "my word" .
usta
16
@kiki: -rfür grep bedeutet rekursives Suchen in Unterverzeichnissen und -nbedeutet, dass jeder Ausgabezeile die entsprechende Zeilennummer der Datei vorangestellt wird, die diese Zeile enthält. man grepbeschreibt all dies und noch viel mehr.
usta
62

GREP : Globaler Ausdruck / Parser / Prozessor / Programm für reguläre Ausdrücke.
Hiermit können Sie das aktuelle Verzeichnis durchsuchen.
Sie können -R für "rekursiv" angeben. Dies bedeutet, dass das Programm in allen Unterordnern und ihren Unterordnern sowie in den Unterordnern ihres Unterordners usw. sucht.

grep -R "your word" .

-ndruckt die Zeilennummer, wo sie in der Datei übereinstimmt.
-isucht ohne Berücksichtigung der Groß- und Kleinschreibung (Groß- / Kleinbuchstaben).

grep -inR "your regex pattern" .
Stefan Steiger
quelle
3
./* bedeutet alle Dateien im aktuellen Verzeichnis, -R bedeutet rekursiv (Suche in Unterverzeichnissen usw.)
Stefan Steiger
25
grep -nr search_string search_dir

führt eine RECURSIVE-Suche (dh das Verzeichnis und alle seine Unterverzeichnisse) nach der Suchzeichenfolge durch. (wie von usta richtig beantwortet).

Der Grund, warum Sie mit dem Vorschlag Ihres Freundes keine Antwort erhalten haben:

grep -nr string

liegt daran, dass kein Verzeichnis angegeben wurde. Wenn Sie sich in dem Verzeichnis befinden, in dem Sie suchen möchten, müssen Sie Folgendes tun:

grep -nr string .

Es ist wichtig, das '.' Zeichen, da dies grep anweist, DIESES Verzeichnis zu durchsuchen.

Nico Huysamen
quelle
Hallo, was mache ich, wenn ich 2 Wörter mit einem Leerzeichen dazwischen suchen muss? Sollten die Wörter in Anführungszeichen angegeben werden? dh grep -nr "mein Wort".
Kiki
24

Es gibt auch:

find directory_name -type f -print0 | xargs -0 grep -li word

aber das könnte ein bisschen viel für einen Anfänger sein.

findist ein Allzweck-Verzeichnis-Walker / Lister, -type fbedeutet "Suche nach einfachen Dateien anstelle von Verzeichnissen und Named Pipes und was hast du?", -print0bedeutet "Drucke sie auf der Standardausgabe mit Nullzeichen als Trennzeichen". Die Ausgabe von findwird an gesendet xargs -0und erfasst die Standardeingabe in Blöcken (um Einschränkungen der Befehlszeilenlänge zu vermeiden), wobei Nullzeichen als Datensatztrennzeichen (anstelle der Standard-Zeilenumbruch) verwendet werden. Dies gilt grep -li wordfür jeden Dateisatz . Auf der grep, -lbedeutet „Liste der Dateien, die“ und -ibedeutet „Groß- und Kleinschreibung“; Normalerweise können Sie einzelne Zeichenoptionen kombinieren, sodass Sie -lihäufiger als sehen -l -i.

Wenn Sie nicht verwenden -print0und -0dann auf Probleme mit Dateinamen stoßen, die Leerzeichen enthalten, ist die Verwendung dieser Leerzeichen eine gute Angewohnheit.

mu ist zu kurz
quelle
1
@mmmshuddup: Danke. Ich fühle mich schlecht, wenn ich als Teil der Antwort keine Erklärung gebe, besonders wenn ich mit einem Anfänger arbeite.
Mu ist zu kurz
1
Das ist es, was ich auf dieser Seite am meisten zu schätzen gelernt habe. Es ist wichtig, sich daran zu erinnern, dass wir alle einmal Anfänger waren und es in der Welt der Technologie nicht einfach ist, aufzusteigen!
Ja Barry
Kann ich bestimmte Verzeichnisse ausschließen? @ Muistooshort
Ferologics
@Ferologics Überprüfen Sie man findin der Befehlszeile, welche Optionen Sie findunterstützen.
Mu ist zu kurz
8

Warum nicht eine rekursive Suche durchführen, um alle Instanzen in Unterverzeichnissen zu finden:

grep -r 'text' *

Das funktioniert wie ein Zauber.

Paxwell
quelle
1
Keine Notwendigkeit, Suchzeichenfolge ohne Sonderzeichen wie Leerzeichen zu zitieren
Scott Stensland
5
  1. grep -r "yourstring" * Findet "yourstring" in allen Dateien und Ordnern

Wenn Sie nun gleichzeitig nach zwei verschiedenen Zeichenfolgen suchen möchten, können Sie immer die Option E verwenden und Wörter für die Suche hinzufügen. Beispiel nach der Pause

  1. grep -rE "yourstring|yourotherstring|$" *sucht nach Listenorten, an denen yourstringoder yourotherstringübereinstimmt
Nwaoga
quelle
4

Eine weitere Option, die ich gerne benutze:

find folder_name -type f -exec grep your_text  {} \;

-type f gibt nur Dateien und keine Ordner zurück

-exec und {} führen das grep für die Dateien aus, die bei der Suche gefunden wurden (die genaue Syntax lautet "-exec command {}").

jfhfhf839
quelle
4
grep -R "string" /directory/

-R folgt auch Symlinks, wenn -r dies nicht tut.

DimiDak
quelle
2

Die Antwort, die Sie ausgewählt haben, ist in Ordnung und funktioniert, aber es ist nicht der richtige Weg, weil:

grep -nr yourString* .

Dies durchsucht tatsächlich die Zeichenfolge "yourStrin"und "g"0 oder viele Male.

Der richtige Weg, dies zu tun, ist:

grep -nr \w*yourString\w* .

Dieser Befehl durchsucht die Zeichenfolge mit einem beliebigen Zeichen vor und nach dem aktuellen Ordner.

eLRuLL
quelle
2
jedoch grep -nr yourStringfunktioniert auch, da es für die nackten sieht yourStringüberall in der Linie (oder zumindest tut es auf meinem System, OSX Lion)
theheadofabroom
1

Ähnlich wie bei der Antwort von @eLRuLL können Sie eine Suche, die Wortgrenzen berücksichtigt, einfacher angeben, indem Sie die folgende -wOption verwenden:

grep -wnr "yourString" .
Mike Slinn
quelle
In der cmd-Eingabeaufforderung oder im Windows-Terminal wird der Begriff grep nicht erkannt
kouty
@kouty grep ist ein Unix-Befehl. itechtics.com/using-findstr-windows
Hugo M. Zuleta
1

Führen Sie (Terminal) den folgenden Befehl im Verzeichnis aus. Es wird auch rekursiv in Unterverzeichnissen überprüft.

grep -r 'your string goes here' * 
Iwantha
quelle
0

Das folgende Beispiel sucht rekursiv nach your search stringden Dateien *.xmlund *.js, die sich irgendwo in den Ordnern befinden path1, path2und path3.

grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3

Sie können also in einer Teilmenge der Dateien nach vielen Verzeichnissen suchen und nur die Pfade am Ende angeben.

yucer
quelle
-4

Verwenden Sie nicht grep. Laden Sie Silver Searcher oder ripgrep herunter . Sie sind beide hervorragend und viel schneller als grep oder ack mit unzähligen Optionen.

AAAfarmclub
quelle
2
Diese vielleicht großartigen Tools beantworten jedoch nicht, wie ich diese Tools verwenden würde, um das zu erreichen, was das OP verlangt.
Jmathew