Textdateien und Ordner mit grep durchsuchen

In diesem Artikel möchte ich dir zeigen wie man Dateien durchsuchen kann. Diese Technik ist bei großen Logfiles sehr hilfreichen, aber auch wenn man viele Dateien durchsuchen möchte. Wenn du nur eine recht kleine Textdatei durchsuchen möchtest, dann kannst du auch einfach einen grafischen Texteditor nutzen z.B. „gedit“.

Nun legen wir los mit grep!

Wie immer zu beginn die Syntax:

grep [OPTION]… MUSTER [DATEI]…

Das heißt also zu erst kommen irgendwelche Optionen und anschließend kommt ein Muster und dann muss man noch eine Datei angeben.

Ohne groß drum herum zu reden, kommen hier direkt einige Beispiele:

Ich habe einen Ordner „test“ erstellt und eine Textdatei mit dem Namen test1.txt. In der test1.txt steht folgendes:

Dies ist eine kleine test datei
damit wollen wir die Funktion grep testen
GREP kann man auch groß schreiben.
Wir sind richtige Tester

Nun können wir sofort mit dem testen anfangen:

ubuntu@ubuntu:~/test$ grep Funktion test1.txt
damit wollen wir die Funktion grep testen

Wie du unschwer sehen kannst habe ich nachdem Wort „Funktion“ in der Textdatei „test1.txt“ gesucht und ich habe die gesamte Zeile erhalten in der das Wort steht.

Der selbe Aufruf nur das Wort Funktion klein geschrieben:

ubuntu@ubuntu:~/test$ grep funktion test1.txt

gibt uns nichts zurück, da das Wort Funktion klein geschrieben nicht in der Textdatei vorkommt, deswegen gibt es die Option -i, dieser weist grep an Groß- und Kleinschreibung zu ignorieren.

ubuntu@ubuntu:~/test$ grep -i funktion test1.txt
damit wollen wir die Funktion grep testen

Siehe da! Er findet die Zeile wieder!

Nun wollen wir nach dem Wort test suchen!

ubuntu@ubuntu:~/test$ grep test test1.txt
Dies ist eine kleine test datei
damit wollen wir die Funktion grep testen

Wir haben wir in der Datei nach test gesucht und 2 Zeilen erhalten, da in beiden Zeilen „test“ in irgendeiner Form vorkommt!

Wenn wir nun aber nur die Zeilen angezeigt bekommen wollen, in denen das Wort „test“ isoliert vorkommt müssen wir die Option -w hinzufügen. Das sieht dann wie folgt aus:

ubuntu@ubuntu:~/test$ grep -w test test1.txt
Dies ist eine kleine test datei

Das gewünschte Ergebnis tritt ein!

Wenn du die Zeilennummer wissen möchtest, in der der gesuchte Begriff steht, musst du lediglich die Option -n hinzufügen:

ubuntu@ubuntu:~/test$ grep -w -n test test1.txt
1:Dies ist eine kleine test datei

Wie wir sehen hat uns grep die entsprechende Zeilennummer am Anfang des Outputs angezeigt.

Nun kommen wir zu einem sehr praktischen Punkt. Wir können mit grep auch mehrere Dateien gleichzeitig durchsuchen. Das funktioniert wie folgt:

ubuntu@ubuntu:~/test$ grep -w test test1.txt test2.txt
test1.txt:Dies ist eine kleine test datei
test2.txt:Dies ist eine kleine test datei

Ich habe die Datei test1.txt kopiert und unter test2.txt abgespeichert, dann habe ich den oben zu sehenden Befehl eingeben und diese Ausgabe erhalten. Wie du sehen kannst gibt er mir wie gewohnt die gesamte Zeile zurück, aber da er in beiden Dateien etwas gefunden hat, zeigt er sie 2x an. Durch das „test1.txt:Dies…“ können wir auch erkennen wo er die Zeile gefunden hat!

Um nur die Dateinamen der Dateien zu erhalten, in der das Wort enthalten ist, gibt es die Option -l:

ubuntu@ubuntu:~/test$ grep -l test test1.txt test2.txt
test1.txt
test2.txt

Die Optionen sind übrigens beliebig kombinierbar, wie dieses Beispiel deutlich zeigt:

ubuntu@ubuntu:~/test$ grep -w -i grep test1.txt
damit wollen wir die Funktion grep testen
GREP kann man auch groß schreiben.

Es wird nach dem Wort grep gesucht, allerdings isoliert und Groß- und Kleinschreibung sind ebenfalls egal.

Es ist auch möglich ganze Ordner mit grep zu durchsuchen, dass geht wie folgt:

ubuntu@ubuntu:~$ grep -w -i grep test/*
test/test1.txt:damit wollen wir die Funktion grep testen
test/test1.txt:GREP kann man auch groß schreiben.
test/test2.txt:damit wollen wir die Funktion grep testen
test/test2.txt:GREP kann man auch groß schreiben.

Wir suchen in diesem Beispiel nach dem Wort „grep“ in allen Dateien des Ordners „test“, der Stern (*), steht für alles, und wir halten das zu erwartende Ergebnis!

Die Funktion grep bietet auch einen kleinen Umfang von RegEx(Reguläre Ausdrücke) Funktionen. Wir haben bis her für den Suchausdruck immer Wörter benutzt, um dies ein wenig allgemeiner zu fassen gibt es RegEx. Ich werde das Thema nur im kleinsten möglichem Rahmen anreißen, da mit RegEx ganze Bücher gefüllt werden. Es hier in seiner ganzen breite zu erklären würde den Rahmen nicht nur sprengen, sondern ihn in seine Atome zersetzen.

Hier ein paar Beispiele:

ubuntu@ubuntu:~/test$ grep [a-z] test1.txt
Dies ist eine kleine test datei
damit wollen wir die Funktion grep testen
GREP kann man auch groß schreiben.
Wir sind richtige Tester

Er gibt uns jede Zeile aus, da in jeder Zeile ein Zeichen aus dem Bereich a-z enthalten ist, hier wird übrigens auch zwischen Groß- und Kleinschreibung unterschieden!

ubuntu@ubuntu:~/test$ grep ^GREP test1.txt
GREP kann man auch groß schreiben.

Das „Dach“ ( ^ ) weist grep an nur am Anfang der Zeile nach dem Wort „GREP“ zu suchen.
$ macht genau das Gegenteil:

ubuntu@ubuntu:~/test$ grep datei$ test1.txt
Dies ist eine kleine test datei

Die RegEx-Zeichen sind beliebig kombinierbar:

ubuntu@ubuntu:~/test$ grep [i]$ test1.txt
Dies ist eine kleine test datei

Es wird nur diese Zeile ausgegeben, da diese die Einzige ist mit einem i am Ende.

Wenn man sich ernsthaft damit beschäftigen möchte, schlage ich vor sich ein entsprechendes Buch zu kaufen.

Die Option „-e“ erlaubt es ihnen die ganze Power von RegExen zu nutzen, und nicht nur bisschen

Zum Schluss noch mal die wichtigsten Optionen zusammengefasst:

Option Erläuterung
-i ignoriert Groß/Kleinschreibung
-w Das gesuchte Wort muss alleine stehen. z.B. Wir suchen „test“, dann würde mit -w „tester“ nicht gefunden werden.
-n Gibt die Zeilennummer aus, auf der der Ausdruck gefunden wurde.
-l Wenn du in mehreren Dateien suchst, dann gibt -l nur die Dateinamen an in denen der Ausdruck gefunden wurde.
-x Der Ausdruck muss der gesamten Zeile entsprechen, z.b. du suchst das Wort „test“, wenn nun in einer Zeile „test 123 frau“ steht, dann würde diese Zeile nicht ausgegeben werden, da test nicht alleine steht.
-e Erlaubt komplizierte RegEx’s mit grep zu nutzen

11 Gedanken zu „Textdateien und Ordner mit grep durchsuchen

  1. Jumace

    Moin,
    coole kleine Einführung, brint einem auf jedenfall mehr als das „help grep“ von unbuntu 🙂

    Hab aber einen kleinen Fehler gefunden:
    „Wenn du die Zeilennummer wissen möchtest, in der der gesuchte Begriff steht musst du lediglich die Option -m hinzufügen“

    Wie du selbst weißt muss da ein „-n“ stehen, danach ist es ja auch weiter richtig erklärt 🙂

    Weiter so!

  2. Jonny

    Sehr hilfreich =)
    Dickes Dankeschöön!!!
    Mache eine Berufsausbildung für den Informations- und Kommunikationstechnischen Assi (Assistenten :D…).

    Wir sollten uns genauer mit dem grep-befehl beschäftigen und diese Seite hat mir sehr viel geholfen 😀 nochmal ein richtig dickes Dankeschön !!!!!

  3. Dennis

    Hallo

    Hat auch mir sehr geholfen.
    Was mir noch gefehlt hat ist die Option -r (rekursiv)
    Mit -r werden auch Unterorder durchsucht.

    Gruss Dennis

  4. Ewald

    Ich bin Anfänger und komme leider über dieses Stadium nicht hinaus. Mir ist noch nicht ganz klar, warum so viele Leute so begeistert sind von Ubuntu oder Linux. Wenn mir das doch mal bitte Einer erklären könnte.
    Wenn ich mir die Befehlskette anschaue, die ich formulieren muss, um eine einfache Suchaufgabe zu lösen (ubuntu@ubuntu:~/test$ grep Funktion test1.txt), sehe ich mich in die DOS-Anfänge vor 25 Jahren zurückversetzt. Auch da musste ich in die Befehlsebene abtauchen und alle Befehle und ihre Optionen auswendig wissen. Mir ist bekannt, dass diese Formulierung ein Frevel bedeutet, ich weiß nur nicht warum.
    Die Erklärung oben ist sicher mustergültig. Aber wo schreibe ich die Befehle denn hin? Muss ich denn immer den kompletten Pfad hinschreiben, wenn die Datei zum Beispiel auf einem anderen Laufwerk ist? Auch ist mir nicht klar, wozu man hier die Zeichen ~/ benötigt (vermutlich seid ihr schon lange nicht mehr auf so viel Ignoranz gestoßen).
    Ach, wie wünschte ich mir, dass der Rechtsklick bei Ubuntu hilfreicher wäre und mich gleich beim Suchen in einem bestimmten Laufwerk (die bei mir alle Volume heißen) und Unterordner unterstützen würde. Ich habe mich inzwischen so an kontextbezogene Menüs gewöhnt und für mich ist Ubuntu ein echter Rückschritt.
    Vielleicht sollte ich als nächste neue Vokabel grep lernen, viele schwärmen von diesem Begriff, das habe ich schon gemerkt. Vielleicht lerne ich dann auch einmal, wann und warum man bei so trivialen Suchaufgaben auch mit den Zeichen Dach, Dollarzeichen, Tilde, Sternchen etc. operieren muss, das haben sich sicher benutzerferne Programmierer ausgedacht.
    Mit eurer Hilfe werde ich vielleicht doch noch leidenschaftlicher Ubuntu-Benutzer.
    Vielen Dank.

  5. Pingback: Kommentarantwort über Anfängerprobleme - Ubuntu hilfe

  6. Dragonclaw

    Also genial, wie oben schon geschrieben, besser als manpages!!!

    Bei mir habe ich endlich den sch… „anonymous“ aus meinem Jinzorra Musikserver bekommen. Der ist in der Konfiguration und ich wollte nicht jede Datei „abklappern“. Mit Deinem Tutorial hab ich es in 15min. geschafft.

    Mach weiter so. Ich hab mich nie an die Optionen getraut, geschweige denn an Befehle wie grep und co.

  7. Tilia

    Ich hoffe jetzt einfach mal, dass mein Kommentar hier noch gesehen wird, dieser Artikel ist jetzt auch schon ein Weilchen her…
    Fürs Studium muss ich leider genau mit den Optionen arbeiten, die hier nicht beschrieben werden: -e und -E. Ich arbeite seit nicht einmal einem Monat mit Unix, und hab – gelinde gesagt – nicht viel Ahnung, doch für ein paar wichtige Aufgaben (für die mir nur noch das Wochenende bleibt…) brauche ich diese Optionen. Es geht einmal darum, sowohl mit -e als auch mit -E alle verschiedene Wortformen eines Verbes aus einem Teilabschnitt des tiger-corpus herauszufiltern, also mit allen möglicherweise vorhandenen – oder eben nicht vorhandenen – Präfixe und Suffixe. Ich finde zwar immer Teilanleitungen, aber wie ein solcher Befehl als ganzes aussehen müsste, damit er am Ende auch funktioniert, ist mir ein Rätsel. Wenn du mir da ein wenig unter die Arme greifen könntest, wäre das ziemlich hilfreich.
    In einer anderen Aufgabe kommt noch hinzu, dass neben dem gleichbleibenden Präfix und Suffix, wenn man es in diesem Fall so nennen will, das dazwischenliegende Buchstabenpaar zwischen 0 und unendlich mal vorkommen kann – und das soll entsprechend im Befehl verarbeitet werden, und wieder habe ich keine Ahnung wie der Befehl aussehen könnte.
    Wie gesagt, beide Aufgaben müssen mit -e und -E bearbeitet werden, was das ganze nicht gerade einfacher macht, und nach diesem Artikel wirkt es auf mich eher so, als wären diese beiden Optionen eigentlich nicht gerade das, womit man in dieses Programm einsteigen sollte, was womöglich die weit verbreitete Verwirrung im Kurs erklären könnte…
    Ich hoffe also, dass dieser Kommentar noch irgendwie ankommt und hoffentlich auch noch beantwortet wird.
    Der Artikel ist so jedenfalls auch so schon ziemlich hilfreich und definitiv einer der wenigen zu diesem Befehl, durch die man sich nicht durchquälen muss 😉

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.