2009-03-30 20 views
155

ho bisogno di fare un grep ricorsivo in Windows, qualcosa di simile a Unix/Linux:di Windows ricorsiva grep comando-line

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

o il metodo più-preferito:

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

I' m bloccato con solo cmd.exe, quindi ho solo comandi integrati di Windows. Sfortunatamente non posso installare Cygwin o altri strumenti di terze parti come UnxUtils su questo server. Non sono nemmeno sicuro di poter installare PowerShell. Qualche suggerimento usando solo built-in cmd.exe (Windows 2003 Server)?

+0

Questo è difficile senza PowerShell, perché può non installare? –

+0

Gli amministratori di sistema bloccano le autorizzazioni sui nostri server. Se qualcuno ha qualche suggerimento di PowerShell, buttali fuori, e vedrò se possiamo installare PowerShell. –

+3

btw, ho trovato che in linux è meglio scrivere: "find. | Xargs grep -i string". La differenza è che se find restituisce una lista molto lunga, potresti superare la lunghezza massima del comando (è successo a me), e non sarai in grado di grep affatto. con xargs grep viene chiamato una volta per file trovato. –

risposta

193

findstr può eseguire 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. 
+32

findstr è un ottimo sostituto di grep. Tendo ad usare findstr/sinp (ricorsiva, maiuscole e minuscole, salta file binari e mostra numeri di riga) –

+3

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

+2

Sospiro, fidati di Microsoft per aggiungere una nuova utility (findstr) invece di correggerne uno esistente (trova). Se vuoi che findstr possa contare le linee, usa questo - findstr [opzioni] | find/c/v "" - usa findstr per abbinare le linee e trova per contarle. Sì, find considera che nessuna riga corrisponde a una stringa vuota, quindi con/v tutte le linee corrisponderanno. – yoyo

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

I parametri hanno il seguente significato:

  • s = ricorsiva
  • p = saltare caratteri non stampabili
  • i = case insensitive linea
  • n = stampa numeri

E la stringa da cercare è il bit di mettere tra virgolette dopo /c:

+2

Siamo spiacenti. Potresti aggiungere un esempio? Cos'è 'spin'? È la linea di testo da trovare? E non è/g o/f usato per specificare i file? Allora, che cosa è con le parentesi quadre? –

+5

'findstr /?' Spiega ciascun parametro. s = ricorsivo, p = salta i caratteri non stampabili, i = maiuscole/minuscole, n = stampa i numeri di riga. Non hai necessariamente bisogno di tutti questi, ma mi piacciono e 'spin' è facile da ricordare. La stringa da cercare è il bit che inserisci tra virgolette dopo '/ c:'. –

+2

Oh haha. Ho fatto un '/?', Ma in realtà non sapevo che i modificatori fossero usati come '/ spin'. Pensavo che fossero usati come/s/p/i/n'. –

8

vi consiglio davvero un ottimo strumento:

nativo unix utils:

Basta scompattare loro e mettere quella cartella nella variabile d'ambiente PATH e voilà ! :)

funziona come un fascino, e ci sono molto di più quindi solo grep;)

+2

Hai votato perché non ha letto completamente la domanda. –

+5

@mPrinC La domanda dice "Non riesco a installare Cygwin, o strumenti di terze parti come UnxUtils su questo server, purtroppo". –

+4

In suvato perché è ancora utile per me. Inoltre non richiede 'installazione', basta estrarla da qualche parte. –

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

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

+0

Solo per riferimento, con findstr, si ottengono i nomi dei file evidenziati sulla riga di comando, e non si ottiene questo in un file di testo (ovviamente). Quindi non è scontato che il file di testo sia un formato più utile. –

10

ho solo cercato un testo con il comando seguente che mi ha elencato tutti i nomi di file contenenti il ​​mio specificato 'testo da ricercare' .

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

Select-String ha funzionato meglio per me. Tutte le altre opzioni elencate qui, come findstr, non hanno funzionato con file di grandi dimensioni.

Ecco un esempio:

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

nota: Ciò richiede Powershell

4

ricerca ricorsiva per import parola all'interno src cartella:

> findstr /s import .\src\*