Windows rekursywny wiersz polecenia grep

204

Muszę zrobić rekurencyjny grep w Windows, coś takiego w Unix / Linux:

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

lub bardziej preferowana metoda:

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

Utknąłem z tylko cmd.exe, więc mam tylko wbudowane polecenia systemu Windows. Niestety nie mogę zainstalować Cygwin ani narzędzi innych firm, takich jak UnxUtils na tym serwerze. Nie jestem nawet pewien, czy mogę zainstalować PowerShell. Wszelkie sugestie dotyczące używania tylko wbudowanych funkcji cmd.exe (Windows 2003 Server)?

Andy White
źródło
To jest trudne bez PowerShell, dlaczego nie możesz zainstalować?
Chris Ballance
Administratorzy sys blokują uprawnienia na naszych serwerach. Jeśli ktoś ma jakieś sugestie PowerShell, wyrzuć je, a zobaczę, czy możemy zainstalować PowerShell.
Andy White
3
btw, znalazłem, że w Linuksie lepiej napisać: "find. | xargs grep -i string". Różnica polega na tym, że jeśli find zwraca bardzo długą listę, możesz przekroczyć maksymalną długość polecenia (tak mi się zdarzyło) i nie będziesz w stanie grepować. z xargs grep jest wywoływany raz na znaleziony plik.
Nathan Fellman
Wiele wersji Grepa, w tym Gnu Grep, oferuje wbudowane wyszukiwanie rekurencyjne ( gnu.org/software/grep/manual/... ), więc twoje wyszukiwanie może być napisane jako, grep -i 'string' -R .które, jak sugeruje @NathanFellman, pozwala uniknąć problemu zbyt długich poleceń.
Scott Centoni,

Odpowiedzi:

251

findstr potrafi wyszukiwać rekurencyjnie (/ S) i obsługuje niektóre warianty składni wyrażeń regularnych (/ 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
źródło
45
findstr to świetny zamiennik grep. Zwykle używam findstr / sinp (rekurencyjne, bez rozróżniania wielkości liter, pomijam pliki binarne i wyświetlam numery linii)
Steve Rowe
5
Niestety findstr ma bardzo ograniczone wsparcie dla wyrażeń regularnych, zgodnie z dokumentacją i wzorami, których próbowałem użyć.
John Kaster
3
Westchnij, zaufaj Microsoftowi, że doda nowe narzędzie (findstr) zamiast naprawiać już istniejące (find). Jeśli chcesz, aby findstr mógł liczyć wiersze, użyj tego - findstr [opcje] | find / c / v "" - użyj findstr, aby dopasować linie i znaleźć, aby je policzyć. Tak, find uważa, że ​​żadna linia nie pasuje do pustego łańcucha, więc z / v każda linia będzie pasować.
yoyo,
3
Nie chcieli zrywać istniejących rurociągów, które polegały na zepsutym zachowaniu find.
i_am_jorf
134
findstr /spin /c:"string" [files]

Parametry mają następujące znaczenie:

  • s = rekurencyjny
  • p = pomiń znaki niedrukowalne
  • i = wielkość liter nie ma znaczenia
  • n = drukuj numery linii

A ciąg do wyszukania to bit, po którym wstawisz cudzysłowy /c:

i_am_jorf
źródło
2
Przepraszam. Czy możesz dodać przykład? Co jest spin? Czy to wiersz tekstu do znalezienia? I czy do określenia plików nie użyto / g lub / f? Co z kwadratowymi nawiasami klamrowymi?
Wolfpack'08,
5
findstr /?wyjaśnia każdy parametr. s = rekurencyjny, p = pomiń znaki niedrukowalne, i = nie rozróżnia wielkości liter, n = drukuj numery linii. Niekoniecznie potrzebujesz ich wszystkich, ale je lubię i spinłatwo je zapamiętać. Ciąg do wyszukania to bit, po którym wstawisz cudzysłowy /c:.
i_am_jorf
3
Oh haha. Zrobiłem /?, ale tak naprawdę nie wiedziałem, że używane są modyfikatory /spin. Myślałem, że były używane /s/p/i/n.
Wolfpack'08,
4
Tak, ogólnie. Niektóre programy cmd pozwalają zwolnić wrt /s. To jest jeden. Nie wszystkie pozwalają na to. Wiesz, cmd jest bardzo wyjątkowy.
i_am_jorf
2
Jest on jednak dystrybuowany jako część systemu Windows, a zatem spełnia oryginalne wymagania dotyczące plakatów, co można zrobić za pomocą cmd.exe, który nie wymaga instalowania dodatkowego oprogramowania.
i_am_jorf
26

Właśnie przeszukałem tekst za pomocą następującego polecenia, w którym wymieniono wszystkie nazwy plików zawierające mój określony „tekst wyszukiwania”.

C:\Users\ak47\Desktop\trunk>findstr /S /I /M /C:"search text" *.*
khichar.anil
źródło
13

Polecam naprawdę świetne narzędzie:

narzędzia natywnego unixa:

Po prostu rozpakuj je i umieść ten folder w zmiennej środowiskowej PATH i voila! :)

Działa jak urok, a jest o wiele więcej niż tylko grep;)

mPrinC
źródło
5
@mPrinC Pytanie brzmi: „Niestety nie mogę zainstalować Cygwin ani narzędzi innych firm, takich jak UnxUtils na tym serwerze”.
martin jakubik 27.10.11
7
Głosowałem, ponieważ wciąż jest dla mnie przydatny. Nie wymaga też „instalacji”, wystarczy ją gdzieś wypakować.
Rosdi Kasim
12

Rekurencyjne wyszukiwanie importsłowa w srcfolderze:

> findstr /s import .\src\*
Tonatio
źródło
9
for /f %G in ('dir *.cpp *.h /s/b') do  ( find /i "what you search"  "%G") >> out_file.txt
złoty chłopak
źródło
To wygląda podobnie do tej odpowiedzi tutaj serverfault.com/a/506615 , ale podoba mi się to, że przesyłasz odpowiedź do pliku. O wiele łatwiejsze do spożycia.
jinglesthula,
Tylko w celach informacyjnych, z findstr, dostajesz podświetlone nazwy plików w linii poleceń i nie dostajesz tego w pliku tekstowym (oczywiście). Dlatego nie jest oczywiste, że plik tekstowy jest bardziej przydatnym formatem.
Martin Greenaway,
5

Select-Stringdziałało najlepiej dla mnie. Wszystkie inne wymienione tutaj opcje, takie jak findstr, nie działały z dużymi plikami.

Oto przykład:

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

Uwaga : Wymaga Powershell

zamieć
źródło