Baris perintah grep rekursif Windows

205

Saya perlu melakukan grep rekursif di Windows, sesuatu seperti ini di Unix / Linux:

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

atau metode yang lebih disukai:

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

Saya terjebak hanya dengan cmd.exe, jadi saya hanya memiliki perintah bawaan Windows. Sayangnya saya tidak dapat menginstal Cygwin , atau alat pihak ke-3 seperti UnxUtils di server ini. Saya bahkan tidak yakin dapat menginstal PowerShell. Adakah saran yang hanya menggunakan cmd.exe built-in (Windows 2003 Server)?

Andy White
sumber
Itu sulit tanpa PowerShell, mengapa Anda tidak bisa menginstal?
Chris Ballance
Admin sys mengunci izin di server kami. Jika ada yang punya saran PowerShell, buang mereka, dan saya akan melihat apakah kita dapat menginstal PowerShell.
Andy White
3
btw, saya telah menemukan bahwa di linux lebih baik menulis: "find. | xargs grep -i string". Perbedaannya adalah bahwa jika menemukan mengembalikan daftar yang sangat panjang, Anda mungkin melebihi panjang perintah maksimum (itu terjadi pada saya), dan Anda tidak akan dapat menerima sama sekali. dengan xargs grep dipanggil sekali per file yang ditemukan.
Nathan Fellman
Banyak versi Grep, termasuk Gnu Grep, menawarkan pencarian rekursif bawaan ( gnu.org/software/grep/manual/… ), sehingga pencarian Anda dapat ditulis grep -i 'string' -R ., seperti yang disarankan oleh @NathanFellman, menghindari masalah perintah yang terlalu panjang.
Scott Centoni

Jawaban:

253

findstr dapat melakukan pencarian rekursif (/ S) dan mendukung beberapa varian sintaks 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
sumber
45
findstr adalah pengganti grep yang bagus. Saya cenderung menggunakan findstr / sinp (rekursif, case-sensitive, melewatkan file biner, dan menunjukkan nomor baris)
Steve Rowe
5
Sayangnya, findstr memiliki dukungan yang sangat terbatas untuk regex, sesuai dengan dokumentasi dan pola yang saya coba gunakan.
John Kaster
3
Sigh, percayalah pada Microsoft untuk menambahkan utilitas baru (findstr) alih-alih memperbaiki yang sudah ada (find). Jika Anda ingin findstr dapat menghitung baris, maka gunakan ini - findstr [opsi] | find / c / v "" - gunakan findstr untuk mencocokkan garis dan temukan untuk menghitungnya. Ya, cari menganggap bahwa tidak ada baris yang cocok dengan string kosong, jadi dengan / v setiap baris akan cocok.
yoyo
3
Mereka tidak ingin mematahkan jaringan pipa yang ada yang bergantung pada perilaku rusak yang ditemukan.
i_am_jorf
134
findstr /spin /c:"string" [files]

Parameter memiliki arti sebagai berikut:

  • s = rekursif
  • p = lewati karakter yang tidak dapat dicetak
  • i = tidak sensitif huruf besar / kecil
  • n = mencetak nomor baris

Dan string untuk mencari adalah bit yang Anda masukkan setelah tanda kutip /c:

i_am_jorf
sumber
2
Maaf. Bisakah Anda menambahkan contoh? Apa spin? Apakah ini baris teks yang harus dicari? Dan bukankah / g atau / f digunakan untuk menentukan file? Jadi ada apa dengan kawat gigi kotak?
Wolfpack'08
5
findstr /?menjelaskan setiap parameter. s = rekursif, p = melewati karakter yang tidak dapat dicetak, i = case-sensitive, n = nomor baris cetak. Anda tidak perlu semua itu, tetapi saya menyukainya, dan spinmudah diingat. String untuk mencari adalah bit yang Anda masukkan setelah tanda kutip /c:.
i_am_jorf
3
Oh haha. Saya melakukan /?, tetapi saya sebenarnya tidak tahu bahwa pengubah digunakan seperti /spin. Saya pikir mereka digunakan seperti /s/p/i/n.
Wolfpack'08
4
Ya, secara umum. Beberapa program cmd memungkinkan Anda mengendur /. Ini satu. Tidak semua dari mereka membiarkan Anda melakukan itu. Anda tahu, cmd sangat istimewa.
i_am_jorf
2
Namun didistribusikan sebagai bagian dari Windows dan, dengan demikian, memenuhi persyaratan poster asli dari sesuatu yang dapat dilakukan dengan cmd.exe yang tidak memerlukan perangkat lunak tambahan untuk diinstal.
i_am_jorf
26

Saya baru saja mencari teks dengan perintah berikut yang mencantumkan saya semua nama file yang berisi 'teks pencarian' yang ditentukan.

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

Saya merekomendasikan alat yang sangat hebat:

utix asli utils:

Buka kemasannya dan masukkan folder itu ke dalam variabel lingkungan PATH dan voila! :)

Bekerja seperti pesona, dan ada lebih dari sekadar grep;)

mPrinC
sumber
5
@ mPrinC Pertanyaannya mengatakan "Saya tidak bisa menginstal Cygwin, atau alat pihak ke-3 seperti UnxUtils di server ini, sayangnya".
martin jakubik
7
Terpilih karena masih berguna bagi saya. Juga tidak memerlukan 'instalasi', cukup ekstrak di suatu tempat.
Rosdi Kasim
12

Pencarian rekursif untuk importkata di dalam srcfolder:

> findstr /s import .\src\*
Tonatio
sumber
9
for /f %G in ('dir *.cpp *.h /s/b') do  ( find /i "what you search"  "%G") >> out_file.txt
anak emas
sumber
Ini terlihat mirip dengan jawaban ini di sini serverfault.com/a/506615 , tapi saya suka fakta bahwa Anda mengirim jawaban ke file. Jauh lebih mudah dikonsumsi.
jinglesthula
Hanya untuk referensi, dengan findstr, Anda mendapatkan nama file yang disorot pada baris perintah, dan Anda tidak mendapatkan ini dalam file teks (jelas). Jadi bukan karena file teks adalah format yang lebih bermanfaat.
Martin Greenaway
5

Select-Stringbekerja paling baik untuk saya. Semua opsi lain yang tercantum di sini, seperti findstr, tidak berfungsi dengan file besar.

Ini sebuah contoh:

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

Catatan : Ini membutuhkan Powershell

badai
sumber
3

Jika Anda memasang Perl, Anda dapat menggunakan ack , tersedia di http://beyondgrep.com/ .

Andy Lester
sumber