Línea de comando grep recursiva de Windows

205

Necesito hacer un grep recursivo en Windows, algo como esto en Unix / Linux:

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

o el método más preferido:

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

Estoy atascado con solo cmd.exe, por lo que solo tengo comandos integrados de Windows. Lamentablemente , no puedo instalar Cygwin ni ninguna herramienta de terceros como UnxUtils en este servidor. Ni siquiera estoy seguro de poder instalar PowerShell. ¿Alguna sugerencia que use solo cmd.exe incorporado (Windows 2003 Server)?

Andy White
fuente
Eso es difícil sin PowerShell, ¿por qué no puedes instalar?
Chris Ballance
Los administradores del sistema están bloqueando los permisos en nuestros servidores. Si alguien tiene alguna sugerencia de PowerShell, deséchela y veré si podemos instalar PowerShell.
Andy White
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), y no podrá grep en absoluto. con xargs grep se llama una vez por archivo encontrado.
Nathan Fellman
Muchas versiones de Grep, incluida Gnu Grep, ofrecen búsqueda recursiva incorporada ( gnu.org/software/grep/manual/… ), por lo que su búsqueda podría escribirse de manera grep -i 'string' -R .que, como sugiere @NathanFellman, evite el problema de comandos demasiado largos.
Scott Centoni

Respuestas:

253

findstr puede hacer búsquedas recursivas (/ S) y admite alguna variante de 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.
Michael Burr
fuente
45
Findstr es un gran reemplazo para grep. Tiendo a usar findstr / sinp (recursivo, sin distinción entre mayúsculas y minúsculas, omitir archivos binarios y mostrar números de línea)
Steve Rowe
55
Desafortunadamente, los hallazgos tienen un soporte muy limitado para expresiones regulares, de acuerdo con la documentación y los patrones que he tratado de usar.
John Kaster
3
Suspiro, confía en Microsoft para agregar una nueva utilidad (findtr) en lugar de arreglar una existente (find). Si desea que findtr pueda contar líneas, entonces use esto - findtr [opciones] | find / c / v "" - usa findtr para unir líneas y encontrar 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
3
No querían romper las tuberías existentes que se basaban en el comportamiento roto de find.
i_am_jorf
134
findstr /spin /c:"string" [files]

Los parámetros tienen los siguientes significados:

  • s = recursivo
  • p = omitir caracteres no imprimibles
  • i = mayúsculas y minúsculas
  • n = imprimir números de línea

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

i_am_jorf
fuente
2
Lo siento. ¿Podría agregar un ejemplo? ¿Qué es spin? ¿Es la línea de texto para encontrar? ¿Y no se usa / go / f para especificar archivos? Entonces, ¿qué pasa con los corchetes?
Wolfpack'08
55
findstr /?explica cada parámetro s = recursivo, p = omitir caracteres no imprimibles, i = mayúsculas y minúsculas, n = imprimir números de línea. No necesariamente necesita todos esos, pero me gustan y spines fácil de recordar. La cadena a buscar es el bit que pone entre comillas después /c:.
i_am_jorf
3
Oh jaja. Hice un /?, pero en realidad no sabía que se usaban modificadores como /spin. Pensé que se usaban como /s/p/i/n.
Wolfpack'08
44
Si, en general. Algunos programas cmd le permiten aflojar los wrt /s. Este es uno. No todos te permiten hacer eso. Ya sabes, cmd es muy especial.
i_am_jorf
2
Sin embargo, se distribuye como parte de Windows y, por lo tanto, cumple con los requisitos originales de los carteles de algo que se puede hacer con cmd.exe que no requiere la instalación de ningún software adicional.
i_am_jorf
26

Acabo de buscar un texto con el siguiente comando que me enumeró todos los nombres de archivo que contienen mi 'texto de búsqueda' especificado.

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

Recomiendo una herramienta realmente genial:

utilidades nativas de Unix:

¡Simplemente descomprímalos y coloque esa carpeta en su variable de entorno PATH y listo! :)

Funciona como un encanto, y hay mucho más que solo grep;)

mPrinC
fuente
55
@mPrinC La pregunta dice "No puedo instalar Cygwin, ni ninguna herramienta de terceros como UnxUtils en este servidor, desafortunadamente".
martin jakubik
77
Votado porque todavía me es útil. Además, no requiere 'instalación', simplemente extráigala en alguna parte.
Rosdi Kasim
12

Búsqueda recursiva de importpalabra dentro de la srccarpeta:

> findstr /s import .\src\*
Tonatio
fuente
9
for /f %G in ('dir *.cpp *.h /s/b') do  ( find /i "what you search"  "%G") >> out_file.txt
chico de oro
fuente
Esto se parece a esta respuesta aquí 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
Solo como referencia, con findtr, obtienes nombres de archivo resaltados en la línea de comando, y no obtienes esto en un archivo de texto (obviamente). Por lo tanto, no es un hecho que el archivo de texto tenga un formato más útil.
Martin Greenaway
5

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

Aquí hay un ejemplo:

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

nota : Esto requiere Powershell

ventisca
fuente