Grep ist ein ausgezeichnetes Werkzeug, wenn Sie den Inhalt einer Datei durchsuchen müssen.
Normalerweise führen Sie grep auf einer einzelnen Datei wie dieser aus:
grep search_term filename
Grep ist ziemlich vielseitig. Wenn Sie alle Dateien in einem Verzeichnis mit grep durchsuchen möchten , verwenden Sie es wie folgt:
grep search_term *
Es gibt ein Problem damit. Es sucht nur in allen Dateien im aktuellen Verzeichnis. Es wird nicht in den Unterverzeichnissen gesucht.
Sie können eine grep-Suche in allen Dateien und allen Unterverzeichnissen durchführen des aktuellen Verzeichnisses mit -r
rekursive Suchoption:
grep -r search_term .
Sie können auch den Verzeichnispfad angeben, wenn Sie sich nicht in dem Verzeichnis befinden, in dem Sie die Suche durchführen möchten:
grep -r search_term directory_path
Das war eine kurze Zusammenfassung. Lassen Sie mich Ihnen all dies im Detail mit geeigneten Beispielen zeigen, damit es für Sie leichter zu verstehen ist.
Grep sucht in allen Dateien eines Verzeichnisses
Hier ist die Verzeichnisstruktur, die ich in diesem Beispiel verwenden werde. Außer empty.txt enthalten alle Dateien den Begriff 'simple', für den ich die grep-Suche durchführen werde.
[email protected]:~/scripts$ tree
.
├── dir1
│ └── new_script.sh
├── dir2
│ └── your_script.sh
├── dir3
│ ├── empty.txt
│ └── linked.txt -> ../../sample.txt
├── my_script.sh
└── your_script.sh
3 directories, 6 files
Um in allen Dateien der aktuellen Verzeichnisse nach dem Wort 'einfach' zu suchen, verwenden Sie einfach den Platzhalter (*). Der Platzhalter wird tatsächlich durch den Namen aller Dateien und Verzeichnisse im aktuellen Verzeichnis ersetzt.
grep simple *
Dadurch werden alle Dateien in den aktuellen Verzeichnissen durchsucht, aber die Unterverzeichnisse werden nicht betreten. Da Sie nicht direkt in einem Verzeichnis suchen können, wird der Fehler „XYZ ist ein Verzeichnis“ zusammen mit den Suchergebnissen angezeigt.
Wenn Sie sich nicht im selben Verzeichnis befinden, in dem Sie auftreten möchten, können Sie den Verzeichnispfad angeben und mit /*
beendengrep search_term directory_path/*
Grundsätzlich verwenden Sie den Platzhalter, um alle Elemente (Dateien und Verzeichnisse) des angegebenen Verzeichnisses zu erweitern.
Nun, da Sie das wissen, schauen wir uns an, wie Sie mit grep eine rekursive Suche durchführen können, sodass es auch in die Dateien in den Unterverzeichnissen schaut.
Grep rekursive Suche in allen Unterverzeichnissen eines Verzeichnisses
Grep stellt ein -r
bereit Option für die rekursive Suche. Mit dieser Option wird grep in alle Dateien im aktuellen (oder angegebenen) Verzeichnis schauen und es wird auch in alle Dateien aller Unterverzeichnisse schauen.
Hier ist die rekursive Suche, die ich im vorherigen Beispiel durchgeführt habe, um eine grep-Suche im aktuellen Ordner durchzuführen:
grep -r simple .
Hier ist das Ergebnis:
Es gibt auch ein -R
Option für die rekursive Suche und funktioniert fast genauso wie -r
Option.
grep -R simple .
Also, was ist der Unterschied grep -r
und grep -R
? Eigentlich nur eine. Das -R
ist eine dereferenzierte Suche, was bedeutet, dass sie den symbolischen Links folgt, um zur Originaldatei zu gelangen (die sich möglicherweise in einem anderen Teil des Systems befindet).
Sehen Sie sich die Ausgabe von -R
an Suche im gleichen Beispiel:
Ist Ihnen aufgefallen, dass es mit der linked.txt
ein zusätzliches Suchergebnis liefert das ist im Grunde ein symbolischer Link und wurde bei der grep-Suche mit -r
weggelassen Option?
Wenn Sie sich nicht in dem Verzeichnis befinden, in dem Sie die rekursive Suche durchführen möchten, geben Sie einfach den absoluten oder relativen Pfad des Verzeichnisses an den grep-Befehl an:
grep -r search_term path_to_directory
Bonus-Tipp:Bestimmtes Verzeichnis von der rekursiven grep-Suche ausschließen
Alles scheint gut, aber was ist, wenn Sie ein bestimmtes Verzeichnis von der rekursiven Suche ausschließen möchten? Auch dafür gibt es eine Vorschrift. Ich habe Ihnen gesagt, grep ist ein äußerst vielseitiger Befehl.
grep -r --exclude-dir=dir_name serach_term directory_path
Das ist es nicht. Sie können mehr als ein Unterverzeichnis folgendermaßen von der rekursiven Suche ausschließen:
grep -r --exclude-dir={dir1,dir2} serach_term directory_path
So sieht das Ausschließen von Verzeichnissen in unserem Beispiel hier aus:
Und ja, wie das obige Beispiel zeigt, funktioniert der Ausschluss sowohl mit -r
und -R
rekursive Optionen.
Zusammenfassend
Hier ist eine kurze Zusammenfassung der Verwendung der grep-Suche für mehrere Dateien und Verzeichnisse:
Grep-Befehl | Beschreibung |
---|---|
Grep-String * | Sucht in allen Dateien im aktuellen Verzeichnis |
grep string dir | Sucht in allen Dateien im dir-Verzeichnis |
grep -r Zeichenfolge . | Rekursive Suche in allen Dateien in allen Unterverzeichnissen |
grep -r string dir | Rekursive Suche in allen Dateien in allen Unterverzeichnissen von dir |
grep -R Zeichenfolge . | Dasselbe wie r, folgt aber den symbolischen Links |
Ich hoffe, Ihnen gefällt dieser schnelle grep-Tipp. Wenn Sie mehr wollen, können Sie dieses ausführliche Tutorial zur Verwendung des grep-Befehls lesen:
Lassen Sie mich wissen, wenn Sie Fragen oder Vorschläge zu diesem Thema haben.