findstr, das grep für Windows


    Tags: , ,

    Suche mit findstrBei den Tools zur Manipulation von Textdaten konnte Windows nie mit Unix mithalten, das mit grep, cut, sort, diff, wc, head, tail und anderen einen umfangreichen Werkzeugkasten bietet. Wer häufig Klartextinformationen bearbeiten muss, installiert daher am besten die Unix-Tools von cygwin für Windows. Aber zumindest in puncto Suche in Textdateien hat Windows seit XP aufgeholt und bietet mit findstr die wichtigsten Funktionen von grep, Unterstützung für reguläre Ausdrücke inklusive.

    Seit den Zeiten von DOS existiert in der Microsoft-Welt der find-Befehl, dessen Möglichkeiten arg eingeschränkt sind: mit gerade 4 Schaltern lässt sich die Suche konfigurieren (invers, Groß- und Kleinschreibung ignorieren, Anzahl bzw. Nummer der Zeilen, die den gewünschten Ausdruck enthalten).

    findstr als Nachfolger von find

    Deutlich mächtiger ist findstr, bei dem man mit Hilfe von zahlreichen Schaltern nicht nur die Suche besser steuern, sondern darüber hinaus auch reguläre Ausdrücke verwenden kann (oder zumindest das, was Microsoft darunter versteht). Praktisch ist dabei für Anwender, die nicht so vertraut mit regex sind, dass sich einige Optionen als Alternative dazu einsetzen lassen. Das betrifft etwa /b und /e, die veranlassen, dass der Suchbegriff nur am Anfang. bzw. am Ende einer Zeile gefunden wird:

    findstr /b "<?php" *.php

    Mit diesem Befehl such findstr nach allen Vorkommnissen von <?php am Anfang aller Zeilen in sämtlichen php-Dateien des aktuellen Verzeichnisses. Zu beachten ist übrigens, dass alle Schalten bereits vor dem Suchausdruck angegeben werden müssen. Diesbezüglich ist findstr deutlich weniger tolerant als die meisten anderen Kommandozeilen-Programme aus dem Hause Microsoft. Zu beachten ist weiterhin, dass Leerzeichen innerhalb des Suchausdrucks als logisches oder betrachtet wird und daher Treffer gemeldet werden, wenn einer der Teilausdrücke gefunden wird. Wenn man dieses Verhalten unterbinden möchte, muss man den Schalter /c angeben.

    Verzeichnisbäume durchsuchen

    Zu den weiteren interessanten Möglichkeiten zählt die rekursive Suche:

    findstr /s /b "<?php" *.php

    dehnt die Suche aus dem obigen Beispiel auf alle Unterverzeichnisse aus. Möchte man nur bestimmte Verzeichnisse einbeziehen, dann hilft der Schalten /d:

    findstr /d:wp-admin;wp-content /b "?php" *.php

    Diese Variante sucht nur in den Unterverzeichnissen wp-admin und wp-content; die Liste könnte durch Angabe weiterer Ordner verlängert werden, ihr Name muss durch ein Semikolon voneinander getrennt sein.

    Suche zusätzlich eingrenzen

    Weitere Schalter bewirken die Umkehr der Suche (Zeilen, die den Ausdruck nicht enthalten), das Ignorieren von Groß- und Kleinschreibung oder die exakte Übereinstimmung einer Zeile mit dem Suchbegriff. Hier eine Übersicht, die man mit findstr /? erhält:

    Reguläre Ausdrücke

    Über den Schalter /r kann man findstr mitteilen, dass es sich beim übergebenen Suchbegriff um einen regulären Ausdruck handelt. Die regex-Möglichkeit von findstr sind allerdings auf folgende Metazeichen beschränkt:

      .         Platzhalter: beliebiges Zeichen
      *         Wiederholung: keine oder mehrere Wiederholungen
                des/der vorhergehenden Zeichens/Klasse
      ^         Zeilenposition: Anfang der Zeile
      $         Zeilenposition: Ende der Zeile
      [Klasse]  Zeichenklasse: beliebiges Zeichen aus einem Zeichensatz
      [^Klasse] Umgekehrte Klasse: beliebiges Zeichen nicht im Zeichensatz
      [x-y]     Bereich: beliebige Zeichen im angegebenen Bereich
      \x        Escape: direkte Verwendung eines Metazeichens x
      \<xyz     Wortposition: am Anfang des Wortes
      xyz\>     Wortposition: am Ende des Wortes

    Es fällt etwa auf, dass der +-Quantifizierer (mindestens 1 oder beliebig viele Wiederholungen) ebenso fehlt wie Wiederholungsangaben in geschweiften Klammern oder ein greedy-Operator. Ebenfalls nicht vorgesehen ist die Alternation wie z.B. findstr /r (Hund|Katze|Maus) tiere.txt. Wenn man in diesem Fall keine weiteren regex-Features benötigt, müsste man sich mit findstr /r "Hund Katze Maus" tiere.txt behelfen. Andernfalls bleibt nur der Wechsel zu einem richtigen grep.

      /B    Sucht am Zeilenanfang.
      /E    Sucht am Zeilenende.
      /L    Sucht nach dem Text buchstabengetreu.
      /S    Sucht nach entsprechenden Dateien im aktuellen Verzeichnis
            und allen Unterverzeichnissen.
      /I    Ignoriert Groß-/Kleinschreibung.
      /X    Gibt Zeilen aus, die vollkommen übereinstimmen.
      /V    Gibt Zeilen aus, die die Zeichenfolge nicht enthalten.
      /N    Gibt die Zeilennummer vor jeder Trefferzeile an.
      /M    Gibt nur die Namen der Dateien aus, die die Zeichenfolge enthalten.
      /O    Gibt die Position des Zeichens (gemessen vom Zeilenanfang) vor
            jeder gefundenen Zeile aus.
      /P    Überspringt Dateien mit Zeichen, die nicht gedruckt werden können.

    Täglich Know-how für IT-Pros mit unserem Newsletter

    Wir ver­wenden Ihre Mail-Adresse nur für den Ver­sand der News­letter.
    Es erfolgt keine per­sonen­be­zogene Auswertung.

    Bild von Wolfgang Sommergut

    Wolfgang Sommergut hat lang­jährige Erfahrung als Fach­autor, Berater und Kon­ferenz­sprecher zu ver­schie­denen Themen der IT. Da­ne­ben war er als System­ad­mi­ni­stra­tor und Con­sultant tätig.
    // Kontakt: E-Mail, XING, LinkedIn //

    Verwandte Beiträge

    Weitere Links

    4 Kommentare

    Super Sache !

    Ganz einfach in das Verzeichnis hüpfen (per cd ...) und dann das Suchwort und fertig, nice nice !

    findstr /s "Suchwort" *.*

    Gruss - JoNaS :D

    Toller Artikel. Vielen Dank.

    Habe jetzt ein wenig mit der Option für reguläre Ausdrücke gearbeitet. Der Dialekt unterscheidet sich leicht von anderen regulären Ausdrücken unter UNIX. Was ich allerdings gar nicht verstehe ist die Bedeutung vom Blank innerhalb des Ausdrucks.
    Beispiel habe ich einen kurzen Ausdruck der mir eine Datei ohne unerwünschte "Leere"-Zeilen geben soll.
    Leer bedeutet in meinem Fall nur ;, ' oder blanks und nichts anderes brauchbares.
    Umgesetzt hätte ich das mit:

    findstr /V "^[;' ]*$" test.txt > test.txt.adj

    Klappt aber nicht.
    Sobald ich das Blank aus der Klammer nehme läuft es mit ; und '
    Nur Blank alleine ergibt ebenso kein Ergebnis.
    Gibt es dafür eine sinnige Begründung?

    Beste Grüße,

    Simon

    Hallo zusammen,

    auf meinem laptop mit windows8 lässt sich die anwendung findstr nicht öffnen.

    könnt ihr mir sagen warum ?

    Auch wenn es schon lange her ist, laut Infos hätte "findstr.exe" aber geben müssen, da es in XP schon gab (eben überprüft) und es eigentlich bei jeder Version Bestandteil ist (XP bis 11), zuerst veröffentlicht in Windows 2000 Resource Kit mit dem Namen "qgrep", wobei ich "findstr.exe" auch in Windows 2000 mit SP4 finden konnte.