grep- und ripgrep-Befehle erstellen

Erstelle grep- und ripgrep-Suchen mit Include, Exclude und Kontext.

Über dieses Tool

Lege das Muster fest, wo gesucht wird, welche Dateien und Ordner einbezogen oder übersprungen werden und was angezeigt wird (Zeilen mit Kontext, nur Treffer, Anzahl oder Dateinamen). Erhalte die passenden Befehle für GNU grep und ripgrep mit Erklärung zu jedem Flag und teste das Muster direkt auf der Seite an Beispieltext.

So verwendest du es

  1. Gib ein, wonach gesucht werden soll. Mehrere Zeilen werden zu mehreren Mustern, von denen jedes passen kann.
  2. Wähle Regex-, Basic-, Klartext- oder Perl-Syntax und Optionen wie Groß-/Kleinschreibung ignorieren oder ganze Wörter.
  3. Lege fest, wo gesucht wird und welche Dateien und Ordner einbezogen oder übersprungen werden.
  4. Wähle, was angezeigt werden soll, teste das Muster an Beispieltext und kopiere dann den grep- oder ripgrep-Befehl.

Fragen

Wie suche ich rekursiv und überspringe dabei bestimmte Ordner?
Füge für jeden Ordner --exclude-dir hinzu, zum Beispiel grep -r --exclude-dir=.git --exclude-dir=vendor pattern . Mit ripgrep wird alles, was in .gitignore steht, automatisch übersprungen, und -g '!folder/' überspringt weitere.
Wie durchsuche ich nur bestimmte Dateitypen?
Füge bei grep --include='*.log' hinzu (in Anführungszeichen, damit die Shell den Stern nicht expandiert). Nutze bei ripgrep -g '*.log' oder einen eingebauten Typ wie -t py oder -t java.
Was ist der Unterschied zwischen grep -E und einfachem grep?
Einfaches grep verwendet einfache reguläre Ausdrücke (Basic), bei denen + ? | ( ) gewöhnliche Zeichen sind, außer sie werden mit einem Backslash escapet. -E schaltet auf die erweiterte Syntax um, in der sie als Operatoren wirken, genau wie in den meisten Programmiersprachen.
Sollte ich grep oder ripgrep verwenden?
ripgrep (rg) ist bei großen Projekten viel schneller, sucht standardmäßig rekursiv und beachtet .gitignore. grep ist auf jedem Unix-System installiert, was auf Servern und in Skripten wichtig ist.
Wie zeige ich Zeilen rund um jeden Treffer an?
Nutze -C 3 für drei Kontextzeilen auf beiden Seiten oder -B und -A für davor und danach getrennt. Die Vorschau hier zeigt dieselben Kontextzeilen.
Wie suche ich mit grep nach einem Muster, das mit einem Bindestrich beginnt?
grep würde es als Option lesen. Setze -e davor, wie in grep -e "-v" notes.txt, oder beende die Optionen mit zwei Bindestrichen: grep -- "-v" notes.txt. Das Tool ergänzt -e automatisch, sobald ein Muster mit einem Bindestrich beginnt.
Wie durchsuche ich komprimierte .gz-Logdateien?
Einfaches grep sieht nur komprimierte Bytes, deshalb ist *.gz hier standardmäßig ausgeschlossen. Nimm zgrep, das die meisten grep-Optionen akzeptiert, zum Beispiel zgrep -i "timeout" /var/log/app.log.2.gz. Für einen ganzen Ordner rotierter Logs durchsucht zgrep -i timeout /var/log/app.log* einfache und komprimierte Dateien zusammen.
Wie zähle ich Treffer statt passender Zeilen?
grep -c zählt Zeilen, eine Zeile mit drei Treffern zählt also einmal. Um jedes Vorkommen zu zählen, gib jeden Treffer in einer eigenen Zeile aus und zähle diese: grep -o "error" app.log | wc -l. Füge bei beiden Zählungen -i hinzu, wenn die Schreibweise variiert.

Mit grep nach mehreren Wörtern suchen

Um Zeilen zu finden, die eines von mehreren Wörtern enthalten, nutzt du die erweiterte Syntax: grep -E "error|warn" app.log. Dasselbe klappt mit einem -e pro Muster, grep -e error -e warn app.log – genau das erzeugt das Tool, wenn du jedes Muster in eine eigene Zeile schreibst. In der Basissyntax bräuchtest du error\|warn, eine GNU-Erweiterung, die BSD grep auf macOS womöglich nicht akzeptiert.

grep hat keinen UND-Operator. Um Zeilen zu finden, die beide Wörter in beliebiger Reihenfolge enthalten, leite eine Suche in eine zweite weiter: grep -i payment app.log | grep -i timeout. In GNU grep unterstützt -P Lookaheads, wie in grep -P "^(?=.*payment)(?=.*timeout)", aber dem Standard-grep unter macOS fehlt -P. Um Dateien statt Zeilen zu finden, die beide Wörter enthalten, verkette grep -rl mit xargs.

Warum findet grep nichts?

Prüfe zuerst die Anführungszeichen. Ohne Anführungszeichen expandiert die Shell * und $, bevor grep das Muster sieht, setze es also immer in doppelte Anführungszeichen oder in einfache, wenn es $ enthält. Prüfe dann die Syntax: In einfachem grep sind + ? und | gewöhnliche Zeichen, sofern du nicht -E angibst. Und ein Punkt passt auf jedes Zeichen, such eine Versionsnummer also wörtlich mit grep -F "1.2.3".

Dateien mit Windows-Zeilenenden machen Muster kaputt, die mit $ verankert sind, weil jede Zeile mit einem unsichtbaren Carriage Return endet. Berücksichtige ihn mit grep -P "foo\r?$" oder konvertiere die Datei vorher mit dos2unix. Meldet grep „binary file matches“, hat es ein NUL-Byte gefunden; mit -a durchsucht es die Datei trotzdem als Text. Teste das Muster vorher an Beispieltext, hier oder im Regex-Tester, bevor du es auf echte Dateien loslässt.

ripgrep-Entsprechungen gängiger grep-Flags

Die meisten Flags sind in beiden gleich: -i, -w, -v, -c, -l, -o, -m und die Kontextoptionen -A, -B und -C. Die Unterschiede sind tückisch. ripgrep zeigt im Terminal standardmäßig Zeilennummern, -N blendet sie aus. Um Dateinamen auszublenden, nutzt grep -h, ripgrep aber -I, und in grep bedeutet -I, Binärdateien zu überspringen. Um Symlinks zu folgen, nutzt grep -R und ripgrep -L.

ripgrep sucht rekursiv und überspringt versteckte Dateien und alles in .gitignore; --hidden und --no-ignore schalten das ab. Statt --include und --exclude hat es ein einziges Flag: rg -g "*.py" TODO durchsucht nur Python-Dateien, und ein Glob, der mit ! beginnt, schließt aus. Der erzeugte Befehl setzt das in einfache Anführungszeichen, damit bash ! nicht als History-Befehl behandelt. Mit -S, Smart Case, ignoriert ein kleingeschriebenes Muster die Groß-/Kleinschreibung, eines mit Großbuchstaben nicht. grep hat kein Smart Case, deshalb nutzt der grep-Befehl stattdessen -i.

Funktioniert etwas nicht, oder sieht ein Ergebnis falsch aus? Ein Problem mit diesem Tool melden