findstr, das grep für Windows

    Kostenloser Leitfaden: Deployment und Konfiguration von Windows 10. Image-Management mit ADK und MDT, Installation in VHDX, u.v.m. Zum Download »

    (Anzeige)

    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.

    3 Kommentare

    Bild von Jonas
    Jonas sagt:
    24. Mai 2014 - 14:09

    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

    Bild von Simon
    Simon sagt:
    7. Oktober 2014 - 17:28

    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

    Bild von ahmed
    ahmed sagt:
    30. Juli 2015 - 14:59

    Hallo zusammen,

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

    könnt ihr mir sagen warum ?