Odpowiednik Grep dla Windows 7?


241

Czy istnieje odpowiednik grep wiersza polecenia dla systemu Windows 7? To znaczy, chcę odfiltrować wyniki polecenia:

Zastosowanie Bash:

ls | grep root

Co by to było z wiersza polecenia systemu Windows?


9
nie mylić ms-dos z wierszem polecenia. + użycie find i findstr, a nawet grep, dla Windows .. z pewnością można łatwo znaleźć za pomocą szybkiego wyszukiwania. istnieją nawet tabele równoważnych poleceń w systemie Linux i Windows. również twój przykład bash nie jest nawet specyficzny dla bash .. tak sądzę, * nix OS.
barlop

Odpowiedzi:


280

Findstr brzmi jak chcesz. Cały czas używam go jako przybliżonego grepa na platformie Windows.

Kolejny przykład z rurami:

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

Tak, chyba tego właśnie szukam. Rozumiem, że prawdopodobnie istnieją ograniczenia. Dam temu szansę.
chrisjlee

18
dlaczego nie mogliby tak nazwać grep!
Victor Grazi

6
@VictorGrazi Tak naprawdę zrobili na początku, zobacz ten artykuł . Pierwotnie nazywał się qgrep - ale później został przemianowany.
Zitrax

3
Dużym problemem findstrjest to, że wzorzec wyrażenia regularnego może nie zawierać alternatyw.
Wolf

Pytanie dotyczy systemu Windows 7, ale jakie inne wersje systemu Windows mają findstrdomyślnie? Od Windows XP ?
Peter Mortensen

44

Istnieje kilka możliwości:

  • Użyj portu greppolecenia Unix . Istnieje kilka opcji. Często wymieniane są GNUWin32 , cygwin i unxutils . Mniej znane, ale pod pewnymi względami lepsze, są narzędzia z zestawu narzędzi SFUA , które działają w Podsystemie aplikacji dla systemu UNIX, który jest dostępny w zestawie z Windows 7 Ultimate Edition i Windows Server 2008 R2. (W systemie Windows XP można pobrać i zainstalować usługi dla systemu UNIX w wersji 3.5 .) Ten zestaw narzędzi zawiera dużą liczbę narzędzi TUI wiersza polecenia, od mvi dupoprzez powłoki Korna i C, do perliawk. Występuje zarówno w wersjach x86-64 i IA64, jak i x86-32. Programy działają w natywnym środowisku POSIX systemu Windows, a nie z emulatorowymi bibliotekami DLL (np. cygwin1.dll) Nakładającymi warstwy na Win32. I tak, zestaw narzędzi grep, a także około 300 innych.
  • Użyj jednego z wielu rodzimych greppoleceń Win32 , które ludzie napisali i opublikowali. Tim Charron ma na przykład natywną wersję Win32 zmodyfikowanego grepu GNU . Istnieją również PowerGREP , Bare Grep , grepWin , AstroGrep i dnGrep , chociaż są to wszystkie programy GUI, a nie programy TUI.
  • Skorzystaj z dostarczonego findi findstr. grepUwaga: składnia jest inna niż w przypadku wyrażeń regularnych.

cygwin działał dla mnie ładnie na Win 7. Potrzebowałem grep, a GnuWin32 grep nie działał dla mnie.
Kozuch

Piszesz nie widzę perla w SUA C: \ Windows \ SUA> dir perl * / s / b File Not Found i działa np c skorupa SUA nie widzę go w katalogu / bin
barlop

piszesz również, że SFUA jest pod pewnymi względami lepsza. W jaki sposób?
barlop

@Kozuch, chyba że podasz, jak to nie działało, to twój komentarz nie jest przydatny
barlop 24.04.16

19

Jeśli dozwolone są polecenia PowerShell , użyj

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

lub krótki

PS C:\> ls | sls root

Należy pamiętać, że alias slsjest definiowany dopiero od wersji PowerShell 3.0. Możesz dodać alias, aby mniej pisać:

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

Aby uruchomić polecenie PowerShell bezpośrednio z cmd, użyj

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


17

W swojej wczesnej wersji napisałeś MS-DOS, jest tylko FINDtyle, o ile wiem. Ale to starożytny system operacyjny, który nie jest już używany.

W wierszu polecenia systemu Windows NT (np Win2K i wygrać XP i nowszych, tak np win7, win10), można użyć finda findstri jeśli pobrać GnuWin32 następniegrep

Podstawowe różnice polegają na tym, że findstr obsługuje pewne wyrażenia regularne . Grep najlepiej obsługuje wyrażenia regularne.

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

find /?i findstr /?pokazuje, co robią przełączniki.

Gnuwin32 ma „pakiety”. Jeśli pobierasz GnuWin32, proponuję pakiet coreutils dla szeregu podstawowych przydatnych narzędzi, które znasz, ale grep nie jest w tym pakiecie.

Dodany

Grep GnuWin32, kiedy ostatnio sprawdzałem, jest stary. Grep Cygwina jest znacznie bardziej aktualny. Należy również pamiętać, że wiele osób używa maszyn wirtualnych zamiast portów Windows poleceń * nix.


9

Jeśli wolisz używać grepzamiast tego findstr, .exew UnxUtils jest jedna wersja pliku , więc jest przenośna i nie trzeba jej instalować ani używać czegoś takiego jak Cygwin.


Jest to interesujące, ale wymagałoby instalacji tego narzędzia.
chrisjlee

3
@Chris: Nie ma instalacji. To tylko .zipplik .exeplików. Jedynym minusem jest to, że wersje są nieco stare.
paradroid

6
Jakie są wady starzenia się? Czy oprogramowanie może być stare? Wszystkie świeże bajty.
użytkownik nieznany

3
GnuWin32 zapewnia także grepsystem Windows: gnuwin32.sourceforge.net/packages/grep.htm
LiuYan

3
@ użytkownik nieznany dobrze, na przykład komenda unxutils sed jest starsza i nie obsługuje \ d np. \ d22, aby podać cytat. Starszy wget może nie pobrać strony nowszej, a jeśli poprosisz o wsparcie, może poprosić o uzyskanie najnowszej, ponieważ może to rozwiązać niektóre problemy. Naprawdę stary grep bez wątpienia nie będzie miał poziomu obsługi
wyrażeń

3

Możesz spróbować zainstalować Chocolatey w systemie Windows, a następnie zainstalować narzędzie Gow . Zapewni to grepw systemie Windows.

Gowskrót od GNU w systemie Windows. Zapewnia uniksowe narzędzia wiersza poleceń w systemie Windows.


1
Jest to menedżer pakietów, podobny do apt-get, ale dla systemu Windows. Ma swoją nazwę, ponieważ deweloper oparł ją na NuGet, który jest menedżerem pakietów dla studia wizualnego, i to brzmi jak samorodek (jak w samorodku kurczaka), więc pomyślał, że będzie „zabawny” lub „sprytny” i zadzwoni jego program Chocolatey NuGet. Słyszałem o tym na podcastie, z którym przeprowadził wywiad. Gow można również pobrać niezależnie
barlop

1
Jestem nowy w Gow, po kilku dniach użytkowania mogę zaświadczyć, że bardzo mi się podoba - jest lepszy niż wszystkie starsze porty narzędzi UNIX, z których wcześniej korzystałem.
Radim Cernej

@RadimCernej Twój komentarz nie jest przydatny, chyba że podasz, jak myślisz, że jest lepszy.
barlop

@barlop: Odkąd napisałem komentarz z stycznia 2016 roku, stopniowo i całkowicie przestawiłem się na Gow. Do tej pory żadnych błędów, ma wszystkie narzędzia, których potrzebuję / używam, ścieżka jest wyprowadzana w formacie Microsoft (dzięki czemu łatwo kopiować / wklejać do innych programów). Gow jest na tyle nieinwazyjny (łatwy do zainstalowania i usunięcia), że zdecydowanie zalecam przetestowanie go.
Radim Cernej

2

Użyj Bash

$ ls | grep root

Użycie Cmd

> dir /b | findstr root

gdzie /boznacza b to lista katalogów i plików


2
To powiela inną odpowiedź i nie dodaje żadnej nowej treści. Nie publikuj odpowiedzi, chyba że masz coś nowego do dodania.
DavidPostill

@DavidPostill: To szybkie rozwiązanie dla użytkowników „TL; DR” (takich jak ja)
vladkras

To nie jest usprawiedliwienie dla dodania odpowiedzi, która nie wnosi nic nowego. W każdym razie zaakceptowana odpowiedź zawsze pojawi się pierwsza, więc zostanie przeczytana przed twoją.
DavidPostill

@DavidPostill, nie przejmuj się, ale zaakceptowana odpowiedź zawiera wiele nadmiernych i niewyjaśnionych kluczy /B, /Ra /COP nie pytał o to, podczas gdy moja odpowiedź daje dokładny odpowiednik
vladkras

Chodzi o /bto, aby dirwynik był taki sam jak lswynik. Jeśli go przetestujesz, zobaczysz różnicę. Więc to nie jest dokładny odpowiednik.
DavidPostill

2

Napisałem alternatywę dla systemu Windows dla grep za pomocą kodu Hybrid Batch / JScript. Napisałem to, ponieważ uzyskanie znaków ucieczki bezpośrednio w porcie grep GNU Win32 było prawdziwym bólem. Ta wersja działa o wiele bardziej jak chcesz, aby wersja GNU działała w systemie 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);
        }
    }

}

W tym celu możesz zawsze znaleźć najnowszą wersję na mojej stronie Gist .


1

http://www.multireplacer.com

Przygotowano program wielu zamienników, aby można było wykonywać wiele funkcji przy użyciu parametrów wiersza poleceń. Użycie wiersza poleceń jest widoczne poniżej:

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

Nadal możesz używać znanych grepi innych poleceń systemu Linux, pobierając to narzędzie UnxUtils i dodając lokalizację do PATHzmiennej środowiskowej


unxutils grep nie jest tak późno, jak to możliwe .. unx grep jest, 2.4.2ale gnuwin32 ma później 2.5.4
barlop

0

Sugerowałbym użycie busybox-w32 , ponieważ ma tylko około 500 KB i jest aktywnie utrzymywany.

W twoim przypadku w wierszu polecenia jest to:

busybox ls | busybox grep root

Możesz użyć doskeyw wierszu polecenia uruchomienia pliku wsadowego, aby wykonać polecenie, takie jak:

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

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

Następnie możesz użyć ls | grep rootw wierszu polecenia.


ma też
wersję

0

Jeśli chcesz dodać najprostszy grepdo środowiska Windows, przejdź do c:\windows\system32i dodaj mały skrypt wsadowy za pomocą tego polecenia:

echo findstr %1 > grep.bat

Teraz możesz

dir | grep notepad.exe

co jest naprawdę przerażającą mieszanką gówna. Dodaj więc kolejny skrypt wsadowy, lsjak wyjaśniono w tym poście

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

Teraz wszystko wygląda trochę znajomo

ls | grep notepad

HTH


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

To będzie szybki i brudny odpowiednik.

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

Nawiasem mówiąc, ta nudna odpowiedź ma 44 pozytywne głosy na słynnym blogu rosyjskich deweloperów habrahabr.ru/post/71568
vladkras
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.