Grep, Windows 7 için eşdeğeri?


241

Windows 7 için bir komut istemi grep eşdeğeri var mı ? Yani, bir komutun sonuçlarını filtrelemek istiyorum:

Bash kullanımı:

ls | grep root

Windows komut isteminden ne olurdu?


9
ms-dos'yı komut istemi ile karıştırmayın. + Bul ve bul ve hatta grep kullanımı +, pencereler için .. hızlı bir arama ile kesinlikle kolayca bulunur. Linux ve pencerelerde eşdeğer komut tabloları bile var. Ayrıca bash örneği bash'a bile özgü değil .. sadece sanırım, * nix OS.
barlop

Yanıtlar:


280

Findstr, istediğin gibi ses çıkarır. Her zaman Windows platformunda yaklaşık bir grep eşdeğeri olarak kullanıyorum.

Borular ile başka bir örnek :

C:\> dir /B | findstr /R /C:"[mp]"

Evet, aradığım şey bu gibi görünüyor. Muhtemelen sınırlamalar olduğunu biliyorum. Bir deneyeceğim.
chrisjlee

18
neden sadece grep diyemediler!
Victor Grazi

6
@VictorGrazi Aslında ilk başta yaptılar, bu makaleye bakın . Başlangıçta qgrep olarak adlandırıldı - ancak daha sonra yeniden adlandırıldı.
Zitrax

3
En büyük sorun findstr, regex modelinin alternatif içermemesidir.
Kurt

Soru, Windows 7 ile ilgilidir, ancak Windows'un başka hangi sürümleri var findstr? Windows XP’den beri mi?
Peter Mortensen,

44

Birkaç olasılık var:


cygwin Win 7'de benim için çok iyi çalıştı. Grep'e ihtiyacım vardı ve GnuWin32 grep de işe yaramadı.
Kozuch

SUA'da perl görmüyorum C: \ Windows \ SUA> dir perl * / s / b Dosya Bulunamadı ve çalışıyor örn.
SUA'nın

Ayrıca SFUA'nın bazı yönlerden daha iyi olduğunu da yazarsınız. Hangi şekillerde?
barlop

Nasıl işe yaramadığını belirtmediğiniz sürece @Kozuch, daha sonra yorumunuzu kullanışsız
barlop

19

Eğer PowerShell komutları izin kullanmak

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

veya kısa

PS C:\> ls | sls root

Diğer adın slsyalnızca PowerShell sürüm 3.0 ile başlayarak tanımlandığını unutmayın. Daha az yazmak için bir takma ad ekleyebilirsiniz:

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

PowerShell komutunu doğrudan cmd'den çalıştırmak için,

C:\>powershell -command "ls | select-string root"


17

İlk revizyonunuzda MS-DOS yazdınız, FINDbildiğim kadarıyla sadece var . Ancak artık kullanılmayan eski bir işletim sistemi.

Windows NT komut isteminde (örneğin Win2K ve XP ve daha sonra kazanmak böylece örneğin win7, win10), kullanabilirsiniz findve findstrindirmek ve eğer GnuWin32 sonragrep

Temel farklar, findstr'nin bazı düzenli ifade desteğine sahip olmasıdır. Grep, düzenli ifadeleri en iyi şekilde destekler.

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

find /?ve findstr /?anahtarların ne yaptığını gösterir.

Gnuwin32'nin "paketleri" var. GnuWin32'yi indirirseniz, aşina olacağınız bir sürü temel yardımcı program için coreutils paketini öneririm, ancak grep, kendi paketi değildir.

Eklendi

GnuWin32'nin grep'i, en son kontrol ettiğimde eski. Cygwin'in grep'i bugüne kadar çok daha fazla. Ayrıca birçok kişinin * nix komutlarının pencerelerindeki portları yerine Sanal Makineler kullandığını da unutmayın.


9

Eğer kullanmak grepyerine findstr, UnxUtils'te tek bir .exedosya sürümü var , bu nedenle taşınabilir ve onu kurmanıza ya da Cygwin gibi bir şey kullanmanıza gerek yok.


Bu ilginç ama bu aracın kurulmasını gerektiriyor.
chrisjlee

3
@Chris: Kurulum yok. Bu sadece bir .zipdosya .exedosyası. Tek küçük dezavantajı sürümleri biraz eski olmasıdır.
paradroid

6
Yaşlanmanın dezavantajı nedir? Yazılım eski olabilir mi? Tüm taze baytlar.
kullanıcı bilinmeyen

3
GnuWin32 ayrıca grepWindows sağlar: gnuwin32.sourceforge.net/packages/grep.htm
LiuYan 研 研

3
@ userunknown, örnek olarak, unxutils sed komutu daha eskidir ve alıntı belirtmek için \ d eg \ d22'yi desteklemez. Daha eski bir wget daha yeni bir sayfanın indireceği bir sayfayı indirmeyebilir ve destek istemeniz durumunda, bazı sorunları çözebilecek en son sayfayı almanızı isteyebilirler. Gerçekten eski bir grep, şüphe yok ki şu anki olan regex desteği seviyesine sahip olmayacak
barlop

3

Chocolatey'i Windows'a yüklemeyi deneyebilir ve Gow aracını yükleyebilirsiniz . Bu size grepWindows'ta sağlayacaktır .

GowWindows’ta GNU’nun kısaltması. Windows'ta Unix komut satırı yardımcı programları sağlar.


1
Bir apt-get gibi ama bir paket için paket yöneticisi. Adını aldı, çünkü geliştirici görsel stüdyosun bir paket yöneticisi olan NuGet'in temeline dayandı ve nugget (tavuk nugget'ta olduğu gibi) gibi sesler çıkardı, bu yüzden "komik" ya da "zeki" olacağını düşündü ve aradı. Onun programı Chocolatey NuGet. Bunu onunla röportaj yapan bir podcast üzerinde duydum. Gow bağımsız olarak da indirilebilir
barlop

1
Gow'da yeniyim, birkaç günlük kullanımdan sonra, bundan çok hoşlandığımı söyleyebilirim - daha önce kullandığım tüm eski UNIX bağlantı noktalarından daha iyidir.
Radim Cernej,

Eğer devlet olmadıkça @RadimCernej yorumunuz kullanışlı değildir nasıl bunu daha iyi olduğunu düşünüyorum.
barlop

@ barlop: Ocak-2016 yorumumu yazdığımdan bu yana yavaş yavaş ve tamamen Gow'a geçti. Bugüne kadar hiçbir hata, ihtiyacım olan / kullanmam gereken tüm araçları var, yolu Microsoft biçiminde çıktı (diğer programlara kopyalamak / yapıştırmak için kolay). Gow, test sürüşü yapmanızı şiddetle tavsiye edecek kadar invaziv değildir (kurulumu ve çıkarması kolaydır).
Radim Cernej

2

Bash kullanımı

$ ls | grep root

Cmd kullanımı

> dir /b | findstr root

nerede /baçılımı b dizin ve dosya listesi vardır


2
Bu, başka bir yanıtı çoğaltır ve yeni bir içerik eklemez. Gerçekten katkıda bulunacak yeni bir şeyiniz yoksa lütfen cevap yazmayın.
DavidPostill

@DavidPostill: Bu "TL; DR" kullanıcıları (benim gibi) için hızlı bir çözümdür
vladkras

Bu, yeni bir şeye katkıda bulunmayan bir cevap eklemek için mazeret değildir. Her durumda, kabul edilen cevap her zaman önce görünecek ve sizinkinden önce okunacaktır.
DavidPostill

@DavidPostill, umursamıyorum, ama kabul cevap birden aşırı ve ihtiva açıklanamayan tuşları /B, /Rve /Ccevabım verir iken OP, sormadın tam eşdeğeri
vladkras

/bYapmaktır dirçıkış ile aynı lsçıktı. Eğer test ederseniz, farkı göreceksiniz. Yani tam olarak eşdeğer değil.
DavidPostill

2

Hybrid Batch / JScript kodunu kullanarak grep için bir Windows alternatifi yazdım. Bunu yazdım çünkü GNU Win32 grep portundaki kaçış karakterlerini doğru bulmak gerçekten acı vericiydi. Bu sürüm, GNU sürümünün Windows'ta çalışmasını nasıl istediğinize benzer şekilde çalışır:

@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);
        }
    }

}

En son sürümü her zaman Gist sayfamda bulabilirsiniz .


1

http://www.multireplacer.com

Çok işlevli komut programı, birçok fonksiyonun komut satırı parametreleri kullanılarak gerçekleştirilebileceği şekilde hazırlanmıştır. Komut satırı kullanımı aşağıda görülmektedir:

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]


0

Sadece yaklaşık 500 KB boyutunda ve aktif bir şekilde bakımı yapıldığı için busybox-w32 kullanmanızı öneririm .

Böylece sizin durumunuzda, komut isteminde bu:

busybox ls | busybox grep root

doskeyKomut isteminde, örneğin bir komut yapmak için toplu iş dosyası tarafından başlatılan komutları kullanabilirsiniz :

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

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

Sonra ls | grep rootkomut isteminde kullanabilirsiniz.


o da bir android yapı var
barlop

0

grepWindows ortamınıza en basitini eklemek istiyorsanız, c:\windows\system32bu komutu kullanarak küçük bir toplu komut dosyasına gidin ve ekleyin:

echo findstr %1 > grep.bat

Şimdi yapabilirsin

dir | grep notepad.exe

Bu gerçekten korkunç bir bok karışımı. Yani lsbu yazı açıklandığı gibi başka bir toplu komut dosyası ekleyin

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

Şimdi işler biraz tanıdık geliyor

ls | grep notepad

HTH


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

Bu hızlı ve kirli bir eşdeğer olacak.

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

Bu arada, bu donuk cevabın ünlü rus dev blogunda 44 oy hakkı var habrahabr.ru/post/71568
vladkras
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.