Linha de comando grep recursiva do Windows

205

Eu preciso fazer um grep recursivo no Windows, algo assim no Unix / Linux:

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

ou o método mais preferido:

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

Estou preso apenas com o cmd.exe, então só tenho comandos internos do Windows. Infelizmente, não consigo instalar o Cygwin ou quaisquer ferramentas de terceiros como o UnxUtils neste servidor. Nem tenho certeza de que posso instalar o PowerShell. Alguma sugestão usando apenas os built-ins do cmd.exe (Windows 2003 Server)?

Andy White
fonte
Isso é difícil sem o PowerShell, por que você não pode instalar?
31530 Chris Ballance
Os administradores do sistema estão bloqueando permissões em nossos servidores. Se alguém tiver alguma sugestão de PowerShell, jogue-a fora e verei se podemos instalar o PowerShell.
Andy White
3
btw, eu descobri que no linux é melhor escrever: "find. | xargs grep -i string". A diferença é que, se find retorna uma lista muito longa, você pode exceder o tamanho máximo do comando (isso aconteceu comigo) e não conseguirá grep. com xargs grep é chamado uma vez por arquivo encontrado.
18411 Nathan Fellman
Muitas versões do Grep, incluindo o Gnu Grep, oferecem pesquisa recursiva incorporada ( gnu.org/software/grep/manual/… ), para que sua pesquisa possa ser escrita como a grep -i 'string' -R .que, como sugere @NathanFellman, evita o problema de comandos excessivos.
22615 Scott Centoni15:

Respostas:

253

findstr pode fazer pesquisas recursivas (/ S) e suporta alguma variante da sintaxe regex (/ 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
fonte
45
O findstr é um ótimo substituto para o grep. I tendem a usar findstr / SINP (recursivo, maiúsculas e minúsculas, ignorar arquivos binários, e os números mostram linha)
Steve Rowe
5
Infelizmente, o findstr tem um suporte muito limitado ao regex, de acordo com a documentação e os padrões que tentei usar.
precisa
3
Suspiro, confie na Microsoft para adicionar um novo utilitário (findstr) em vez de corrigir um existente (localizar). Se você deseja que o findstr possa contar linhas, use-o - findstr [opções] | find / c / v "" - use findstr para combinar linhas e encontre para contá-las. Sim, a localização considera que nenhuma linha corresponde a uma sequência vazia, portanto, com / v cada linha corresponderá.
yoyo
3
Eles não queriam interromper os pipelines existentes que dependiam do comportamento interrompido da descoberta.
01
134
findstr /spin /c:"string" [files]

Os parâmetros têm os seguintes significados:

  • s = recursivo
  • p = pular caracteres não imprimíveis
  • i = não diferencia maiúsculas de minúsculas
  • n = imprimir números de linha

E a sequência a ser pesquisada é a parte que você coloca entre aspas depois /c:

i_am_jorf
fonte
2
Desculpe. Você poderia adicionar um exemplo? O que é spin? É a linha de texto a encontrar? E / g ou / f não é usado para especificar arquivos? Então, o que há com os aparelhos quadrados?
Wolfpack'08
5
findstr /?explica cada parâmetro. s = recursivo, p = pular caracteres não imprimíveis, i = sem distinção entre maiúsculas e minúsculas, n = imprimir números de linha. Você não precisa necessariamente de todos, mas eu gosto deles e spiné fácil de lembrar. A string a ser pesquisada é a parte que você colocou entre aspas /c:.
I_am_jorf
3
Oh haha. Eu fiz um /?, mas na verdade eu não sabia que modificadores eram usados ​​assim /spin. Eu pensei que eles eram usados ​​como /s/p/i/n.
precisa
4
Sim, em geral. Alguns programas cmd permitem que você libere os /s. Isso é um. Nem todos permitem que você faça isso. Você sabe, o cmd é muito especial.
i_am_jorf 31/12/11
2
No entanto, ele é distribuído como parte do Windows e, portanto, atende aos requisitos de pôsteres originais de algo que pode ser feito com o cmd.exe que não requer a instalação de nenhum software adicional.
01
26

Acabei de pesquisar um texto com o seguinte comando, que me listou todos os nomes de arquivos que contêm meu 'texto de pesquisa' especificado.

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

Eu recomendo uma ferramenta realmente ótima:

utilitários unix nativos:

Apenas descompacte-os e coloque essa pasta na variável de ambiente PATH e pronto! :)

Funciona como um encanto, e há muito mais do que apenas grep;)

mPrinC
fonte
5
@mPrinC A pergunta diz: "Não consigo instalar o Cygwin ou quaisquer ferramentas de terceiros como o UnxUtils neste servidor, infelizmente".
martin Jakubik
7
Votado porque ainda é útil para mim. Também não requer 'instalação', apenas extraia-o em algum lugar.
Rosdi Kasim
12

Pesquisa recursiva por importpalavra dentro da srcpasta:

> findstr /s import .\src\*
Tonatio
fonte
9
for /f %G in ('dir *.cpp *.h /s/b') do  ( find /i "what you search"  "%G") >> out_file.txt
goldenBoy
fonte
Isso é semelhante a esta resposta aqui serverfault.com/a/506615 , mas eu gosto do fato de você canalizar a resposta para um arquivo. Muito mais fácil de consumir.
jinglesthula
Apenas para referência, com o findstr, você obtém os nomes dos arquivos destacados na linha de comando e não recebe isso em um arquivo de texto (obviamente). Portanto, não é um dado que o arquivo de texto seja um formato mais útil.
Martin Greenaway
5

Select-Stringfuncionou melhor para mim. Todas as outras opções listadas aqui, como findstr, não funcionaram com arquivos grandes.

Aqui está um exemplo:

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

Nota : Isso requer o PowerShell

nevasca
fonte
3

Se você tiver o Perl instalado, poderá usar o ack , disponível em http://beyondgrep.com/ .

Andy Lester
fonte