Grep setara untuk Windows 7?

241

Apakah ada command prompt grep yang setara untuk Windows 7? Yaitu, saya ingin memfilter hasil perintah:

Penggunaan bash:

ls | grep root

Apa itu dari prompt perintah Windows?

chrisjlee
sumber
9
jangan bingung ms-dos dengan command prompt. + Penggunaan find dan findstr dan bahkan grep, untuk windows .. pasti mudah ditemukan dengan pencarian cepat. bahkan ada tabel perintah setara di linux dan windows. Anda juga contoh bash bahkan tidak spesifik untuk bash .. hanya saya kira, * nix OS.
barlop

Jawaban:

280

Findstr terdengar seperti apa yang Anda inginkan. Saya menggunakannya sepanjang waktu sebagai perkiraan setara grep pada platform Windows.

Contoh lain dengan pipa:

C:\> dir /B | findstr /R /C:"[mp]"
Greg Jackson
sumber
Ya, itulah yang saya cari. Saya mengerti mungkin ada keterbatasan. Saya akan mencobanya.
chrisjlee
18
kenapa mereka tidak bisa menyebutnya grep!
Victor Grazi
6
@ ViktorGrazi Mereka benar-benar melakukannya pada awalnya, lihat artikel ini . Awalnya bernama qgrep - tetapi kemudian diganti namanya.
Zitrax
3
Masalah besarnya findstradalah bahwa pola regex mungkin tidak mengandung alternatif.
Wolf
Pertanyaannya adalah tentang Windows 7, tetapi versi Windows apa yang findstrsecara default dimiliki ? Sejak Windows XP ?
Peter Mortensen
44

Ada beberapa kemungkinan:

  • Gunakan port dari grepperintah Unix . Ada beberapa pilihan. Yang disebutkan di atas adalah GNUWin32 , cygwin , dan unxutils . Yang kurang terkenal, tetapi dalam beberapa hal lebih baik, adalah alat-alat dalam toolkit utilitas SFUA , yang berjalan di Subsistem untuk Aplikasi berbasis UNIX yang hadir di sana dalam kotak dengan Windows 7 Ultimate edition dan Windows Server 2008 R2. (Untuk Windows XP, seseorang dapat mengunduh dan menginstal Layanan untuk UNIX versi 3.5 .) Toolkit ini memiliki sejumlah besar alat TUI baris perintah, dari mvdan du, melalui cangkang Korn dan C, ke perldanawk. Muncul dalam rasa x86-64 dan IA64 serta x86-32. Program-program berjalan di lingkungan POSIX asli Windows yang asli, daripada dengan emulator DLL (seperti cygwin1.dll) meletakan sesuatu di atas Win32. Dan ya, toolkit ini memiliki grep, serta sekitar 300 lainnya.
  • Gunakan salah satu dari banyak grepperintah Win32 asli yang telah ditulis dan diterbitkan orang. Tim Charron memiliki versi asli Win32 dari grep GNU yang dimodifikasi , misalnya. Ada juga PowerGREP , Bare Grep , grepWin , AstroGrep , dan dnGrep , meskipun ini semua adalah program GUI bukan program TUI.
  • Gunakan yang disediakan finddan findstr. Sintaksnya berbeda dengan grep, perhatikan, seperti halnya kemampuan ekspresi reguler.
JdeBP
sumber
cygwin bekerja dengan baik untuk saya di Win 7. Saya butuh grep dan GnuWin32 grep tidak bekerja untuk saya.
Kozuch
Anda menulis, saya tidak melihat perl di SUA C: \ Windows \ SUA> dir perl * / s / b File Tidak Ditemukan dan dijalankan misalnya c shell dari SUA Saya tidak melihatnya di / bin
barlop
Anda juga menulis bahwa SFUA dalam beberapa hal lebih baik. Dalam hal apa?
barlop
@Kozuch kecuali Anda menyatakan bagaimana itu tidak berhasil, maka komentar Anda tidak berguna
barlop
19

Jika perintah PowerShell diizinkan, gunakan

PS C:\> Get-ChildItem | Select-String root

atau pendek

PS C:\> ls | sls root

Ketahuilah bahwa alias slshanya didefinisikan diawali dengan PowerShell versi 3.0. Anda dapat menambahkan alias untuk kurang mengetik:

PS C:\> New-Alias sls Select-String

Untuk menjalankan perintah PowerShell langsung dari cmd, gunakan

C:\>powershell -command "ls | select-string root"
oleschri
sumber
2
Grep, cara Powershell. communary.net/2014/11/10/grep-the-powershell-way
Charles Burge
17

Dalam revisi awal Anda, Anda menulis MS-DOS, hanya ada FIND, sejauh yang saya tahu. Tapi ini adalah OS kuno yang tidak digunakan lagi.

Pada prompt perintah Windows NT (mis. Win2K dan win XP dan yang lebih baru, jadi mis. Win7, win10), Anda dapat menggunakan finddan findstrdan jika Anda mengunduh GnuWin32 makagrep

Perbedaan mendasar adalah bahwa findstr memiliki beberapa dukungan ekspresi reguler . Grep mendukung ekspresi reguler terbaik.

C:\>dir | find "abc"
C:\>dir | find /i "abc"

find /?dan findstr /?menunjukkan kepada Anda apa yang dilakukan sakelar.

Gnuwin32 memiliki "paket". Jika Anda mengunduh GnuWin32, saya sarankan paket coreutils untuk sekumpulan utilitas berguna dasar yang akan Anda kenal, tetapi grep tidak memilikinya dengan paket itu sendiri.

Ditambahkan

Grep GnuWin32, terakhir kali saya periksa, sudah tua. Grep Cygwin jauh lebih terkini. Juga ingat bahwa banyak orang menggunakan Mesin Virtual daripada port windows dari perintah * nix.

barlop
sumber
9

Jika Anda lebih suka menggunakan grep, daripada findstr, ada .exeversi file tunggal di UnxUtils , jadi ini portabel dan tidak perlu menginstalnya, atau menggunakan sesuatu seperti Cygwin.

paradroid
sumber
Ini menarik tetapi perlu menginstal alat itu.
chrisjlee
3
@ Chris: Tidak ada instalasi. Itu hanya .zipfile .exefile. Satu-satunya downside kecil adalah bahwa versi agak lama.
paradroid
6
Apa downside menjadi tua? Bisakah perangkat lunak menjadi tua? Semua byte baru.
pengguna tidak diketahui
3
GnuWin32 juga menyediakan grepuntuk Windows: gnuwin32.sourceforge.net/packages/grep.htm
LiuYan 刘 研
3
@userunknown dengan baik, sebagai contoh, perintah sed unxutils lebih tua dan tidak mendukung \ d misalnya \ d22 untuk menentukan kutipan. Wget yang lebih tua mungkin tidak mengunduh halaman yang lebih baru, dan jika Anda meminta dukungan, mereka mungkin meminta Anda mendapatkan yang terbaru karena dapat menyelesaikan beberapa masalah. Grep yang benar-benar tua tidak diragukan lagi tidak akan memiliki tingkat dukungan regex yang dimiliki saat ini
barlop
3

Anda dapat mencoba menginstal Chocolatey di Windows, dan melalui itu, instal alat Gow . Ini akan memberi Anda greppada Windows.

Gowberdiri untuk GNU di Windows. Ini memberikan utilitas baris perintah Unix pada Windows.

Atur
sumber
1
Ini adalah manajer paket, seperti apt-get tetapi untuk windows. Itu mendapat namanya karena pengembang berdasarkan dari NuGet yang merupakan manajer paket untuk studio visual, dan itu terdengar seperti nugget (seperti pada nugget ayam), jadi dia pikir dia akan "lucu" atau "pintar" dan memanggil programnya Chocolatey NuGet. Saya mendengar itu di podcast yang mewawancarainya. Gow juga dapat diunduh secara mandiri
barlop
1
Saya baru mengenal Gow, setelah beberapa hari penggunaan, saya dapat bersaksi bahwa saya sangat menyukainya - ini lebih baik daripada semua port lama dari utilitas UNIX yang telah saya gunakan sebelumnya.
Radim Cernej
@RadimCernej komentar Anda tidak berguna kecuali Anda menyatakan bagaimana menurut Anda itu lebih baik.
barlop
@barlop: Sejak saya menulis komentar Jan-2016 saya secara bertahap dan sepenuhnya beralih ke Gow. Sejauh ini tidak ada bug, ia memiliki semua utilitas yang saya butuhkan / gunakan, path adalah output dalam format Microsoft (membuatnya mudah untuk menyalin / menempel ke program lain). Gow cukup non-invasif (mudah dipasang dan dihapus) sehingga saya sangat menyarankan Anda mengujinya.
Radim Cernej
2

Penggunaan bash

$ ls | grep root

Cmd digunakan

> dir /b | findstr root

di mana /bsingkatan b adalah daftar direktori dan file

vladkras
sumber
2
Ini menggandakan jawaban lain dan tidak menambahkan konten baru. Tolong jangan memposting jawaban kecuali Anda benar-benar memiliki sesuatu yang baru untuk disumbangkan.
DavidPostill
@DavidPostill: Ini adalah solusi cepat untuk pengguna "TL; DR" (seperti saya)
vladkras
Itu bukan alasan untuk menambahkan jawaban yang tidak menyumbangkan sesuatu yang baru. Bagaimanapun jawaban yang diterima akan selalu muncul terlebih dahulu sehingga akan dibaca sebelum Anda.
DavidPostill
@DavidPostill, jangan pedulikan, tetapi jawaban yang diterima berisi beberapa kunci yang berlebihan dan tidak dapat dijelaskan/B , /Rdan /COP tidak bertanya, sedangkan jawaban saya memberikan padanan yang tepat
vladkras
The /badalah untuk membuat diroutput yang sama dengan lsoutput. Jika Anda mengujinya, Anda akan melihat perbedaannya. Jadi itu tidak setara persis.
DavidPostill
2

Saya menulis alternatif Windows untuk grep menggunakan kode Hybrid Batch / JScript. Saya menulis ini karena mendapatkan karakter escape tepat di port grep GNU Win32 benar-benar menyebalkan. Versi ini bekerja lebih seperti bagaimana Anda ingin versi GNU berfungsi di Windows:

@set @junk=1 /*
@cscript //nologo //E:jscript %~f0 %*
@goto :eof */

var args=WScript.Arguments, argCnt=args.Length, stdin=WScript.StdIn, stdout=WScript.StdOut;
var replaceSingleQuotes=false, printMatchesOnly=false, matchString, flagString, regex, argDx=0;

if(argCnt==0) {
    throw new Error("You must provide search criteria.");
}

flagString=""
if(argCnt>1) {
    for(var bLoop=true; bLoop&&argDx<argCnt-1; argDx++) {
        switch(args(argDx)) {
        case '-t': replaceSingleQuotes=true; break;
        case '-o': printMatchesOnly=true; break;
        case '-g': flagString+="g"; break;
        case '-i': flagString+="i"; break;
        case '-m': flagString+="m"; break;
        default: bLoop=false; break;
        }
    }
}
if(replaceSingleQuotes) {
    matchString=args(argCnt-1).replace("'", '"');
} else {
    matchString=args(argCnt-1);
}

if(printMatchesOnly) {
    while(!stdin.AtEndOfStream) {
        var sLine=stdin.ReadLine();
        if(flagString.Length) regex=new RegExp(matchString, flagString);
        else regex=new RegExp(matchString);
        var m,matches=[],startDx=0;
        while((m=regex.exec(sLine.substr(startDx))) !== null) {
            stdout.WriteLine(m[0]);
            startDx+=m.lastIndex;
        }
    }
} else {
    if(flagString.Length) regex=new RegExp(matchString, flagString);
    else regex=new RegExp(matchString);
    while(!stdin.AtEndOfStream) {
        var sLine=stdin.ReadLine();
        if(regex.test(sLine)) {
            stdout.WriteLine(sLine);
        }
    }

}

Anda selalu dapat menemukan versi terbaru di halaman Gist saya untuk ini.

Krowe
sumber
1

http://www.multireplacer.com

Program multi replacer telah disiapkan sehingga banyak fungsi dapat dilakukan dengan menggunakan parameter baris perintah. Penggunaan baris perintah terlihat di bawah:

MultiReplacer [Multi Replacer File] | [Search files] | [Search folders]
[-Subs] [-NoSubs] [-IncPtr=pattern] [-ExcPtr=patterns] [-DestDir=destination]
[-DMAnyTime]
[-DMWithinanhour] [-DMToday] [-DMYesterday] [-DMThisweek] [-DMThismonth]
[-DMThisYear]
[-CDMAfter=date] [-CDMBefore=date] [-MinFileSize=bytes count]
[-MaxFileSize=bytes count]
[-Search=text] [-Case] [-NoCase] [-Regex] [-NoRegex] [-SubMatchText=text]
[-ReplaceText=text]
[-StartSearch] [-StartReplace] [-AutoClose] [-StopAfterMatchThisFile] [-StopAfterMatchAll]
[-ExtractedWordsFile=filename] [-ExtractedLinesFile=filename] [-
ReportFile=filename]
pengguna298490
sumber
0

Anda masih dapat menggunakan grepperintah Linux yang Anda kenal dan yang lainnya dengan mengunduh alat ini UnxUtils dan menambahkan lokasi itu ke PATHvariabel lingkungan Anda

thucnguyen
sumber
unxutils grep tidak selambat yang Anda bisa dapatkan .. unx grep adalah 2.4.2tetapi gnuwin32 memiliki yang lebih baru 2.5.4
barlop
0

Saya akan menyarankan menggunakan busybox-w32 , karena hanya berukuran sekitar 500 KB dan dipelihara secara aktif.

Sehingga dalam kasus Anda, di command prompt, itu adalah:

busybox ls | busybox grep root

Anda bisa menggunakan doskeypeluncuran prompt perintah dengan file batch untuk membuat perintah, seperti:

doskey ls="path\to\busybox.exe" ls $*

doskey grep="path\to\busybox.exe" grep $*

Kemudian Anda dapat menggunakan ls | grep rootcommand prompt.

kissson
sumber
ini memiliki android build juga
barlop
0

Jika Anda ingin menambahkan yang paling sederhana grepke lingkungan windows Anda, maka navigasikan ke c:\windows\system32dan tambahkan skrip batch kecil dengan menggunakan perintah ini:

echo findstr %1 > grep.bat

Sekarang kamu bisa

dir | grep notepad.exe

yang benar-benar campuran yang menakutkan. Jadi tambahkan skrip batch lain lsseperti yang dijelaskan dalam posting ini

echo dir %1 > %systemroot%\system32\ls.bat

Sekarang hal-hal terlihat agak akrab

ls | grep notepad

HTH

domih
sumber
-2
echo findstr %1 %2 %3 %4 %5 > %systemroot%\grep.cmd

Itu akan menjadi setara cepat dan kotor.

C:\Windows\system32>dir | grep xwiz
C:\Windows\system32>findstr xwiz
2009.06.10  23:03             4.041 xwizard.dtd
2009.07.14  03:39            42.496 xwizard.exe
2009.07.14  03:41           432.640 xwizards.dll
Superguest
sumber
Omong-omong, jawaban yang membosankan ini memiliki 44 upvotes di blog dev Rusia terkenal habrahabr.ru/post/71568
vladkras