Riga di comando grep ricorsiva di Windows


205

Ho bisogno di fare un grep ricorsivo in Windows, qualcosa del genere in Unix / Linux:

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

o il metodo più preferito:

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

Sono bloccato con solo cmd.exe, quindi ho solo i comandi integrati di Windows. Purtroppo non riesco a installare Cygwin o altri strumenti di terze parti come UnxUtils su questo server. Non sono nemmeno sicuro di poter installare PowerShell. Qualche suggerimento che utilizza solo cmd.exe integrati (Windows 2003 Server)?


È difficile senza PowerShell, perché non è possibile installare?
Chris Ballance,

Gli amministratori di sistema stanno bloccando le autorizzazioni sui nostri server. Se qualcuno ha qualche suggerimento su PowerShell, buttali fuori e vedrò se possiamo installare PowerShell.
Andy White,

3
a proposito, ho scoperto che in Linux è meglio scrivere: "find. | xargs grep -i string". La differenza è che se find restituisce un elenco molto lungo, potresti superare la lunghezza massima del comando (mi è successo) e non sarai in grado di eseguire il grep. con xargs grep viene chiamato una volta per file trovato.
Nathan Fellman,

Molte versioni di Grep, tra cui Gnu Grep, offrono una ricerca ricorsiva integrata ( gnu.org/software/grep/manual/… ), quindi la tua ricerca potrebbe essere scritta come quella grep -i 'string' -R ., come suggerisce @NathanFellman, evita il problema dei comandi troppo lunghi.
Scott Centoni,

Risposte:


253

findstr può fare ricerche ricorsive (/ S) e supporta alcune varianti della sintassi 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.

45
findstr è un ottimo sostituto di grep. Tendo a usare findstr / sinp (ricorsivo, senza distinzione tra maiuscole e minuscole, salta i file binari e mostra i numeri di riga)
Steve Rowe,

5
Sfortunatamente, findstr ha un supporto molto limitato per regex, secondo la documentazione e gli schemi che ho provato ad usare.
John Kaster,

3
Sospira, fidati di Microsoft per aggiungere una nuova utility (findstr) invece di ripararne una esistente (find). Se desideri che findstr possa contare le linee, usa questo - findstr [opzioni] | find / c / v "" - usa findstr per abbinare le linee e trova per contarle. Sì, trova che nessuna riga corrisponde a una stringa vuota, quindi con / v ogni riga corrisponderà.
yoyo

3
Non volevano interrompere le condutture esistenti che si basavano sul comportamento rotto di find.
i_am_jorf,

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

I parametri hanno i seguenti significati:

  • s = ricorsivo
  • p = salta i caratteri non stampabili
  • i = maiuscole e minuscole
  • n = stampa numeri di riga

E la stringa da cercare è il bit che inserisci tra virgolette /c:


2
Scusate. Potresti aggiungere un esempio? Cosa spin? È la riga di testo da trovare? E / g o / f non sono usati per specificare i file? Allora, cosa c'è con le parentesi graffe quadrate?
Wolfpack'08,

5
findstr /?spiega ogni parametro. s = ricorsivo, p = salta i caratteri non stampabili, i = insensibile alle maiuscole, n = stampa i numeri di riga. Non hai necessariamente bisogno di tutti quelli, ma mi piacciono ed spinè facile da ricordare. La stringa da cercare è il bit che inserisci tra virgolette /c:.
i_am_jorf

3
Oh ah ah Ho fatto un /?, ma in realtà non sapevo che i modificatori fossero usati come /spin. Pensavo fossero usati come /s/p/i/n.
Wolfpack'08

4
Sì, in generale. Alcuni programmi cmd ti permettono di rilassarti /. Questo è uno. Non tutti ti permettono di farlo. Sai, cmd è molto speciale.
i_am_jorf,

2
È tuttavia distribuito come parte di Windows e, quindi, soddisfa i requisiti di poster originali di qualcosa che può essere fatto con cmd.exe che non richiede l'installazione di alcun software aggiuntivo.
i_am_jorf,

26

Ho appena cercato un testo con il seguente comando che mi ha elencato tutti i nomi dei file contenenti il ​​mio "testo di ricerca" specificato.

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

13

Consiglio uno strumento davvero eccezionale:

programmi di utilità nativi unix:

Basta decomprimerli e inserire quella cartella nella variabile di ambiente PATH e voilà! :)

Funziona come un incantesimo, e ce ne sono molti di più che solo grep;)


5
@mPrinC La domanda dice "Purtroppo non riesco a installare Cygwin o qualsiasi strumento di terze parti come UnxUtils su questo server".
martin jakubik,

7
Ha votato perché è ancora utile per me. Inoltre non richiede 'installazione', basta estrarlo da qualche parte.
Rosdi Kasim,

12

Ricerca ricorsiva di importparole all'interno della srccartella:

> findstr /s import .\src\*

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

Sembra simile a questa risposta qui serverfault.com/a/506615 , ma mi piace il fatto che tu installi la risposta in un file. Molto più facile da consumare.
jinglesthula,

Solo per riferimento, con findstr, ottieni nomi di file evidenziati sulla riga di comando e non lo ottieni in un file di testo (ovviamente). Quindi non è scontato che il file di testo sia un formato più utile.
Martin Greenaway,

5

Select-Stringha funzionato meglio per me. Tutte le altre opzioni elencate qui, ad esempio findstr, non funzionavano con file di grandi dimensioni.

Ecco un esempio:

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

nota : questo richiede Powershell


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.