Windows özyinelemeli grep komut satırı


205

Windows'ta yinelenen bir grep, Unix / Linux'ta böyle bir şey yapmam gerekiyor:

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

veya daha fazla tercih edilen yöntem:

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

Sadece cmd.exe ile takılıp kaldım, bu yüzden sadece Windows yerleşik komutları var. Ben yükleyemezsiniz Cygwin gibi veya herhangi bir 3. parti araçlar UnxUtils maalesef bu sunucuda. PowerShell'i yükleyebileceğimden bile emin değilim. Yalnızca cmd.exe yerleşik (Windows 2003 Server) kullanan herhangi bir öneriniz var mı?


Powershell olmadan zor, neden kuramıyorsunuz?
Chris Ballance

Sys yöneticileri sunucularımızdaki izinleri kilitliyor. Herhangi bir powershell önerisi varsa, bunları atın ve PowerShell'i yükleyip yükleyemeyeceğimizi göreceğim.
Andy White

3
btw, Linux'ta şunu yazmanın daha iyi olduğunu gördüm: "find. | xargs grep -i string". Aradaki fark, find çok uzun bir liste döndürürse, maksimum komut uzunluğunu (benim başıma geldiğini) aşabileceğiniz ve hiç de grep yapamayacağınızdır. xargs grep ile bulunan dosya başına bir kez çağrılır.
Nathan Fellman

Gnu Grep de dahil olmak üzere Grep'in birçok sürümü yerleşik yinelemeli arama ( gnu.org/software/grep/manual/… ) sunar, bu nedenle aramanız grep -i 'string' -R .@NathanFellman'ın önerdiği gibi uzun komutlar sorununu önler.
Scott Centoni

Yanıtlar:


252

findstr yinelemeli aramalar (/ S) yapabilir ve regex sözdiziminin (/ R) bazı varyasyonlarını destekler.

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 grep için harika bir alternatif. Findstr / sinp (özyinelemeli, büyük / küçük harfe duyarsız, ikili dosyaları atla ve satır numaralarını göster) kullanma eğilimindeyim
Steve Rowe

5
Ne yazık ki, bulmaya çalıştığım belgelere ve kalıplara göre findstr'in regex için çok sınırlı bir desteği var.
John Kaster

3
İç çek, varolan bir (find) düzeltmek yerine yeni bir yardımcı program (findstr) eklemek için Microsoft'a güven. Eğer findstr satır saymak isterseniz, o zaman bunu kullanın - findstr [seçenekler] | find / c / v "" - satırları eşleştirmek ve bunları saymak için findstr komutunu kullanın. Evet, bul, hiçbir satırın boş bir dizeyle eşleşmediğini düşünür, bu nedenle / v ile her satır eşleşir.
yoyo

3
Bulgunun kırık davranışına dayanan mevcut boru hatlarını kırmak istemediler.
i_am_jorf

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

Parametreler şu anlamlara gelir:

  • s = özyinelemeli
  • p = yazdırılamayan karakterleri atla
  • i = büyük / küçük harfe duyarlı değil
  • n = satır numaralarını yazdır

Ve aranacak dize sonra tırnak içine koymak biraz /c:


2
Afedersiniz. Bir örnek ekleyebilir misiniz? Nedir spin? Bulunacak metin satırı mı? Ve / g veya / f dosyaları belirtmek için kullanılmıyor mu? Peki kare köşeli parantezler neler?
Wolfpack'08

5
findstr /?Her parametreyi açıklar. s = özyinelemeli, p = yazdırılamayan karakterleri atla, i = büyük / küçük harfe duyarlı değil, n = satır numaralarını yazdır. Bunların hepsine ihtiyacınız yok, ama onları seviyorum ve spinhatırlaması kolay. Aranacak dize, tırnak işaretleri arasına koyduğunuz bittir /c:.
i_am_jorf

3
Oh haha. Bir yaptım /?, ama aslında değiştiricilerin kullanıldığını bilmiyordum /spin. Onlar gibi kullanıldığını düşündüm /s/p/i/n.
Wolfpack'08

4
Evet, genel olarak. Bazı cmd programları /s wrt gevşetmek sağlar . Bu bir. Hepsi bunu yapmanıza izin vermiyor. Bilirsiniz, cmd çok özeldir.
i_am_jorf

2
Ancak Windows'un bir parçası olarak dağıtılır ve bu nedenle, herhangi bir ek yazılımın yüklenmesini gerektirmeyen cmd.exe ile yapılabilecek bir şeyin orijinal poster gereksinimlerini karşılar.
i_am_jorf

26

Ben sadece belirtilen 'arama metni' içeren tüm dosya adlarını listeleyen aşağıdaki komutla bir metin aradım.

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

13

Gerçekten harika bir araç öneriyorum:

yerel unix araçları:

Sadece onları açın ve bu klasörü PATH ortam değişkeninize ve voila'ya koyun! :)

Bir cazibe gibi çalışır ve sadece grep'ten çok daha fazlası vardır;)


5
@mPrinC Soru "Ne yazık ki Cygwin veya UnxUtils gibi herhangi bir üçüncü taraf aracını maalesef bu sunucuya yükleyemiyorum" diyor.
martin jakubik

7
Benim için hala yararlı olduğu için oy verildi. Ayrıca 'kurulum' gerektirmez, sadece bir yere çıkarın.
Rosdi Kasım

12

Klasör importiçindeki kelimeyi tekrarlayan arama src:

> findstr /s import .\src\*

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

Bu , buradaki cevaba benziyor serverfault.com/a/506615 , ancak cevabı bir dosyaya yönlendirdiğinizi seviyorum. Tüketmek çok daha kolay.
jinglesthula

Yalnızca başvuru amacıyla, findstr ile, komut satırında vurgulanan dosya adlarını alırsınız ve bunu bir metin dosyasında (açıkçası) almazsınız. Dolayısıyla, metin dosyasının daha kullanışlı bir format olduğu belli değildir.
Martin Greenaway

5

Select-Stringbenim için en iyi çalıştı. Burada listelenen diğer tüm seçenekler, findstrbüyük dosyalarla çalışmadı.

İşte bir örnek:

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

not : Bu Powershell gerektirir


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.