2009-03-30 25 views
155

tengo que hacer un grep recursivo en Windows, algo como esto en Unix/Linux:de Windows grep recursivo de línea de comandos

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

o el método más preferido:

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

I' Estoy atascado con solo cmd.exe, por lo que solo tengo comandos integrados de Windows. No puedo instalar Cygwin, o herramientas de terceros como UnxUtils desafortunadamente en este servidor. Ni siquiera estoy seguro de poder instalar PowerShell. ¿Alguna sugerencia usando solo cmd.exe built-ins (Windows 2003 Server)?

+0

Eso es duro y sin PowerShell, ¿por qué no puede usted ¿instalar? –

+0

Los administradores del sistema están bloqueando permisos en nuestros servidores. Si alguien tiene alguna sugerencia de Powershell, deséchela, y veré si podemos instalar PowerShell. –

+3

Por cierto, he encontrado que en Linux es mejor escribir: "find. | Xargs grep -i string". La diferencia es que si find devuelve una lista muy larga, es posible que exceda la longitud máxima del comando (me ha sucedido a mí), y no podrá grep en absoluto. con xargs grep se llama una vez por archivo encontrado. –

Respuesta

193

findstr puede hacer búsquedas recursivas (/ S) y es compatible con alguna variante de la sintaxis de expresiones regulares (/ 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. 
+32

findstr es un gran reemplazo para grep. Tiendo a utilizar findstr/sinp (recursivo, sin distinción de mayúsculas, omisión de archivos binarios y mostrar números de línea) –

+3

Desafortunadamente, findstr tiene un soporte muy limitado para regex, de acuerdo con la documentación y los patrones que he tratado de usar. –

+2

Suspiro, confíe en Microsoft para agregar una nueva utilidad (findstr) en lugar de arreglar una existente (find). Si desea que findtr pueda contar las líneas, use esto - findstr [opciones] | find/c/v "" - use findstr para hacer coincidir las líneas y find para contarlas. Sí, find considera que ninguna línea coincide con una cadena vacía, por lo que con/v cada línea coincidirá. – yoyo

84
findstr /spin /c:"string" [files] 

Los parámetros tienen los siguientes significados:

  • s = recursiva
  • p = saltar caracteres no imprimibles
  • i = caso insensible línea
  • n = impresión números

Y la cadena a buscar es el bit que poner entre comillas después /c:

+2

Lo siento. ¿Podría agregar un ejemplo? ¿Qué es 'spin'? ¿Es la línea de texto para encontrar? ¿Y no se usa/g o/f para especificar archivos? Entonces, ¿qué pasa con los refuerzos cuadrados? –

+5

'findstr /?' Explica cada parámetro. s = recursivo, p = omite caracteres no imprimibles, i = no distingue entre mayúsculas y minúsculas, n = números de línea impresos. No necesariamente los necesitas, pero me gustan, y 'spin' es fácil de recordar. La cadena para buscar es la que pones entre comillas después de '/ c:'. –

+2

Oh, jaja. Hice un '/?', Pero en realidad no sabía que los modificadores se usaban como '/ spin'. Pensé que se usaron como '/ s/p/i/n'. –

8

recomiendo una herramienta realmente grande:

nativos de UNIX utils:

Sólo descomprimir y poner esa carpeta en su variable de entorno PATH y listo ! :)

funciona como un encanto, y hay mucho más que sólo grep;)

+2

Has votado negativamente porque no leíste la pregunta completamente. –

+5

@mPrinC La pregunta dice "No puedo instalar Cygwin, o herramientas de terceros como UnxUtils en este servidor, lamentablemente". –

+4

Voto a favor porque todavía me es útil. Además, no requiere 'instalación', simplemente extráigalo a otro lugar. –

8
for /f %G in ('dir *.cpp *.h /s/b') do (find /i "what you search" "%G") >> out_file.txt 
+0

Esto es similar a esta respuesta aquí http://serverfault.com/a/506615, pero me gusta el hecho de que canaliza la respuesta a un archivo. Mucho más fácil de consumir – jinglesthula

+0

Solo como referencia, con findstr, obtienes nombres de archivos resaltados en la línea de comandos, y no obtienes esto en un archivo de texto (obviamente). Por lo tanto, no es un hecho que el archivo de texto sea un formato más útil. –

10

que acaba de buscar un texto con comando siguiente que me una lista de los nombres de los archivos que contienen mi 'texto de búsqueda' especificada .

C:\Users\ak47\Desktop\trunk>findstr /S /I /M /C:"search text" *.* 
1

Select-String funcionó mejor para mí. Todas las otras opciones enumeradas aquí, como findstr, no funcionaron con archivos grandes.

He aquí un ejemplo:

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

nota: Esto requiere Powershell

4

búsqueda recursiva de import palabra dentro src carpeta:

> findstr /s import .\src\* 
Cuestiones relacionadas