Windows rekursive grep-Befehlszeile

204

Ich muss unter Windows einen rekursiven Grep durchführen, etwa so unter Unix / Linux:

grep -i 'string' `find . -print`

oder die bevorzugtere Methode:

find . -print | xargs grep -i 'string'

Ich bin nur mit cmd.exe festgefahren, daher habe ich nur Windows-Befehle eingebaut. Ich kann Cygwin oder Tools von Drittanbietern wie UnxUtils leider nicht auf diesem Server installieren . Ich bin mir nicht einmal sicher, ob ich PowerShell installieren kann. Irgendwelche Vorschläge, bei denen nur integrierte cmd.exe-Dateien (Windows 2003 Server) verwendet werden?

Andy White
quelle
Das ist hart ohne Powershell, warum kannst du nicht installieren?
Chris Ballance
Die Systemadministratoren sperren Berechtigungen auf unseren Servern. Wenn jemand Vorschläge für Powershell hat, werfen Sie diese weg, und ich werde sehen, ob wir PowerShell installieren können.
Andy White
3
Übrigens habe ich festgestellt, dass es unter Linux besser ist zu schreiben: "find. | xargs grep -i string". Der Unterschied besteht darin, dass Sie, wenn find eine sehr lange Liste zurückgibt, möglicherweise die maximale Befehlslänge überschreiten (mir ist es passiert) und überhaupt nicht grep können. mit xargs wird grep einmal pro gefundener Datei aufgerufen.
Nathan Fellman
Viele Versionen von Grep, einschließlich Gnu Grep, bieten eine integrierte rekursive Suche ( gnu.org/software/grep/manual/… ), sodass Ihre Suche so geschrieben werden kann, grep -i 'string' -R .dass, wie @NathanFellman vorschlägt, das Problem überlanger Befehle vermieden wird.
Scott Centoni

Antworten:

251

findstr kann rekursive Suchen durchführen (/ S) und unterstützt eine Variante der Regex-Syntax (/ R).

C:\>findstr /?
Searches for strings in files.

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file]
        [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
        strings [[drive:][path]filename[ ...]]

  /B         Matches pattern if at the beginning of a line.
  /E         Matches pattern if at the end of a line.
  /L         Uses search strings literally.
  /R         Uses search strings as regular expressions.
  /S         Searches for matching files in the current directory and all
             subdirectories.
  /I         Specifies that the search is not to be case-sensitive.
  /X         Prints lines that match exactly.
  /V         Prints only lines that do not contain a match.
  /N         Prints the line number before each line that matches.
  /M         Prints only the filename if a file contains a match.
  /O         Prints character offset before each matching line.
  /P         Skip files with non-printable characters.
  /OFF[LINE] Do not skip files with offline attribute set.
  /A:attr    Specifies color attribute with two hex digits. See "color /?"
  /F:file    Reads file list from the specified file(/ stands for console).
  /C:string  Uses specified string as a literal search string.
  /G:file    Gets search strings from the specified file(/ stands for console).
  /D:dir     Search a semicolon delimited list of directories
  strings    Text to be searched for.
  [drive:][path]filename
             Specifies a file or files to search.

Use spaces to separate multiple search strings unless the argument is prefixed
with /C.  For example, 'FINDSTR "hello there" x.y' searches for "hello" or
"there" in file x.y.  'FINDSTR /C:"hello there" x.y' searches for
"hello there" in file x.y.

Regular expression quick reference:
  .        Wildcard: any character
  *        Repeat: zero or more occurrences of previous character or class
  ^        Line position: beginning of line
  $        Line position: end of line
  [class]  Character class: any one character in set
  [^class] Inverse class: any one character not in set
  [x-y]    Range: any characters within the specified range
  \x       Escape: literal use of metacharacter x
  \<xyz    Word position: beginning of word
  xyz\>    Word position: end of word

For full information on FINDSTR regular expressions refer to the online Command
Reference.
Michael Burr
quelle
45
findstr ist ein großartiger Ersatz für grep. Ich neige dazu, findstr / sinp zu verwenden (rekursiv, ohne Berücksichtigung der Groß- und Kleinschreibung, Binärdateien überspringen und Zeilennummern anzeigen)
Steve Rowe
5
Leider unterstützt findstr Regex nur sehr begrenzt, wie aus der Dokumentation und den Mustern hervorgeht, die ich verwendet habe.
John Kaster
3
Seufz, vertraue darauf, dass Microsoft ein neues Dienstprogramm (findstr) hinzufügt, anstatt ein vorhandenes zu reparieren (find). Wenn Sie möchten, dass findstr Zeilen zählen kann, verwenden Sie dies - findstr [Optionen] | find / c / v "" - benutze findstr, um Linien abzugleichen und find, um sie zu zählen. Ja, find berücksichtigt, dass keine Zeile mit einer leeren Zeichenfolge übereinstimmt, sodass mit / v jede Zeile übereinstimmt.
Jojo
3
Sie wollten keine bestehenden Pipelines brechen, die sich auf das kaputte Verhalten von find stützten.
i_am_jorf
133
findstr /spin /c:"string" [files]

Die Parameter haben folgende Bedeutung:

  • s = rekursiv
  • p = nicht druckbare Zeichen überspringen
  • i = Groß- und Kleinschreibung wird nicht berücksichtigt
  • n = Zeilennummern drucken

Und die Zeichenfolge, nach der gesucht werden soll, ist das Bit, nach dem Sie Anführungszeichen setzen /c:

i_am_jorf
quelle
2
Es tut uns leid. Könnten Sie ein Beispiel hinzufügen? Was ist spin? Ist es die zu findende Textzeile? Und wird / g oder / f nicht zum Angeben von Dateien verwendet? Was ist mit den eckigen Klammern?
Wolfpack'08
5
findstr /?erklärt jeden Parameter. s = rekursiv, p = nicht druckbare Zeichen überspringen, i = Groß- und Kleinschreibung nicht berücksichtigen, n = Zeilennummern drucken. Sie brauchen nicht unbedingt alle, aber ich mag sie und spinist leicht zu merken. Die zu suchende Zeichenfolge ist das Bit, nach dem Sie Anführungszeichen setzen /c:.
i_am_jorf
3
Oh haha. Ich habe a gemacht /?, aber ich wusste eigentlich nicht, dass Modifikatoren wie verwendet werden /spin. Ich dachte, sie würden so benutzt /s/p/i/n.
Wolfpack'08
4
Ja, im Allgemeinen. Bei einigen Cmd-Programmen können Sie das /s nachlassen . Dies ist einer. Nicht alle von ihnen lassen Sie das tun. Sie wissen, cmd ist etwas ganz Besonderes.
i_am_jorf
2
Es wird jedoch als Teil von Windows vertrieben und erfüllt somit die ursprünglichen Posteranforderungen von etwas, das mit cmd.exe ausgeführt werden kann, für das keine zusätzliche Software installiert werden muss.
i_am_jorf
26

Ich habe gerade einen Text mit dem folgenden Befehl durchsucht, in dem alle Dateinamen aufgeführt sind, die meinen angegebenen 'Suchtext' enthalten.

C:\Users\ak47\Desktop\trunk>findstr /S /I /M /C:"search text" *.*
khichar.anil
quelle
13

Ich empfehle ein wirklich tolles Tool:

native Unix-Utils:

Packen Sie sie einfach aus und legen Sie diesen Ordner in Ihre PATH-Umgebungsvariable und voila! :) :)

Funktioniert wie ein Zauber, und es gibt viel mehr als nur grep;)

mPrinC
quelle
5
@mPrinC Die Frage lautet "Ich kann Cygwin oder Tools von Drittanbietern wie UnxUtils leider nicht auf diesem Server installieren".
Martin Jakubik
7
Upvoted, weil es mir immer noch nützlich ist. Außerdem ist keine Installation erforderlich. Extrahieren Sie es einfach irgendwo.
Rosdi Kasim
12

Rekursive Suche nach importWörtern im srcOrdner:

> findstr /s import .\src\*
Tonatio
quelle
9
for /f %G in ('dir *.cpp *.h /s/b') do  ( find /i "what you search"  "%G") >> out_file.txt
Goldjunge
quelle
Dies sieht ähnlich aus wie diese Antwort hier serverfault.com/a/506615 , aber ich mag die Tatsache, dass Sie die Antwort an eine Datei weiterleiten . Viel einfacher zu konsumieren.
Jinglesthula
Nur als Referenz erhalten Sie mit findstr hervorgehobene Dateinamen in der Befehlszeile, und dies wird (offensichtlich) nicht in einer Textdatei angezeigt. Es ist also nicht selbstverständlich, dass die Textdatei ein nützlicheres Format ist.
Martin Greenaway
5

Select-Stringhat am besten für mich funktioniert. Alle anderen hier aufgeführten Optionen, z. B. findstr, funktionierten nicht mit großen Dateien.

Hier ist ein Beispiel:

select-string -pattern "<pattern>" -path "<path>"

Hinweis : Dies erfordert Powershell

Blizz
quelle
3

Wenn Sie Perl installiert haben, können Sie ack verwenden , das unter http://beyondgrep.com/ verfügbar ist .

Andy Lester
quelle