Grep-Äquivalent für Windows 7?

241

Gibt es eine Eingabeaufforderung grep Äquivalent für Windows 7? Das heißt, ich möchte die Ergebnisse eines Befehls herausfiltern:

Bash verwenden:

ls | grep root

Was wäre es von einer Windows-Eingabeaufforderung?

chrisjlee
quelle
9
Verwechseln Sie ms-dos nicht mit der Eingabeaufforderung. + Verwendung von find und findstr und sogar grep für Windows .. ist mit einer schnellen Suche sicherlich leicht zu finden. Unter Linux und Windows gibt es sogar Tabellen mit entsprechenden Befehlen. Auch Sie bash Beispiel ist nicht einmal spezifisch für bash .. nur nehme ich an, * nix OS.
Barlop

Antworten:

280

Findstr hört sich nach dem an, was Sie wollen. Ich benutze es die ganze Zeit als ungefähres grep-Äquivalent auf der Windows-Plattform.

Ein weiteres Beispiel mit Rohren:

C:\> dir /B | findstr /R /C:"[mp]"
Greg Jackson
quelle
Ja, das scheint das zu sein, wonach ich suche. Ich verstehe, dass es wahrscheinlich Einschränkungen gibt. Ich werde es versuchen.
Chrisjlee
18
warum konnten sie es nicht einfach grep nennen?
Victor Grazi
6
@ VictorGrazi Sie haben tatsächlich zuerst, siehe diesen Artikel . Es hieß ursprünglich qgrep - wurde aber später umbenannt.
Zitrax
3
Das große Problem dabei findstrist, dass das Regex-Muster möglicherweise keine Alternativen enthält.
Wolf
Die Frage betrifft Windows 7, aber welche anderen Windows-Versionen haben sie findstrstandardmäßig? Seit Windows XP ?
Peter Mortensen
44

Es gibt verschiedene Möglichkeiten:

  • Verwenden Sie einen Port eines Unix- grepBefehls. Es gibt mehrere Möglichkeiten. Oft erwähnt werden GNUWin32 , Cygwin und Unxutils . Weniger bekannt, aber in gewisser Hinsicht besser, sind die Tools im SFUA-Dienstprogramm-Toolkit , die im Subsystem für UNIX-basierte Anwendungen ausgeführt werden , das in Windows 7 Ultimate Edition und Windows Server 2008 R2 enthalten ist. (Unter Windows XP können Sie Services for UNIX Version 3.5 herunterladen und installieren .) Dieses Toolkit enthält eine große Anzahl von Befehlszeilen-TUI-Tools von und über die Korn- und C-Shells zu undmvduperlawk. Es ist sowohl in den Varianten x86-64 und IA64 als auch in x86-32 erhältlich. Die Programme werden in der nativen POSIX-Umgebung von Windows ausgeführt, anstatt mit Emulator-DLLs (wie z. B. cygwin1.dll), die Dinge über Win32 schichten. Und ja, das Toolkit hat grep, sowie rund 300 andere.
  • Verwenden Sie einen der vielen nativen Win32- grepBefehle, die von Benutzern geschrieben und veröffentlicht wurden. Tim Charron hat beispielsweise eine native Win32-Version eines modifizierten GNU-grep . Es gibt auch PowerGREP , Bare Grep , grepWin , AstroGrep und dnGrep , obwohl dies alles GUI-Programme sind, keine TUI-Programme.
  • Verwenden Sie die mitgelieferten findund findstr. Die Syntax unterscheidet sich von der von grepnote, ebenso wie die Fähigkeit zum regulären Ausdruck.
JdeBP
quelle
cygwin hat bei Win 7 sehr gut funktioniert. Ich brauchte grep und GnuWin32 grep hat bei mir nicht funktioniert.
Kozuch
Sie schreiben, ich sehe kein Perl in SUA C: \ Windows \ SUA> dir perl * / s / b Datei nicht gefunden und lauffähig zB c Shell von SUA Ich sehe es nicht in / bin
barlop
Sie schreiben auch, dass die SFUA in gewisser Hinsicht besser ist. Auf welche Weise?
Barlop
@ Kozuch, wenn Sie nicht angeben, wie es nicht funktioniert hat, dann ist Ihr Kommentar nicht nützlich
Barlop
19

Wenn PowerShell- Befehle zulässig sind, verwenden Sie

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

oder kurz

PS C:\> ls | sls root

Beachten Sie, dass der Alias slserst ab PowerShell Version 3.0 definiert wird. Sie können einen Alias ​​für weniger Eingabe hinzufügen:

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

Verwenden Sie, um den PowerShell-Befehl direkt von cmd aus auszuführen

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

In Ihrer frühen Überarbeitung haben Sie MS-DOS geschrieben, es gibt nur FIND, soweit ich weiß. Aber es ist ein uraltes Betriebssystem, das nicht mehr verwendet wird.

In der Windows - NT - Eingabeaufforderung (zB Win2K und gewinnen XP und höher, so zB win7, win10), können Sie verwenden , findund , findstrund wenn Sie herunterladen GnuWin32 danngrep

Die grundlegenden Unterschiede bestehen darin, dass findstr einige reguläre Ausdrücke unterstützt. Grep unterstützt reguläre Ausdrücke am besten.

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

find /?und findstr /?zeigt Ihnen, was die Schalter tun.

Gnuwin32 hat "Pakete". Wenn Sie GnuWin32 herunterladen, empfehle ich das Paket coreutils für eine Reihe grundlegender nützlicher Dienstprogramme, mit denen Sie vertraut sind, aber grep ist nicht in diesem Paket enthalten, sondern in einem eigenen Paket.

Hinzugefügt

GnuWin32s Grep, das letzte Mal, als ich es überprüft habe, ist alt. Cygwins Grep ist viel aktueller. Bedenken Sie auch, dass viele Benutzer eher virtuelle Maschinen als Windows-Ports von * nix-Befehlen verwenden.

barlop
quelle
9

Wenn Sie lieber verwenden würden grep, anstatt findstr, gibt es eine einzige .exeDateiversion in UnxUtils , so tragbar es ist , und es gibt keine Notwendigkeit , es zu installieren, oder so etwas wie Cygwin verwenden.

paradroid
quelle
Dies ist interessant, erfordert jedoch die Installation dieses Tools.
Chrisjlee
3
@ Chris: Es gibt keine Installation. Es ist nur eine .zipDatei von .exeDateien. Der einzige kleine Nachteil ist, dass die Versionen etwas alt sind.
Paradroid
6
Was ist der Nachteil, alt zu sein? Kann Software alt sein? Alles frische Bytes.
Benutzer unbekannt
3
GnuWin32 unterstützt auch grepWindows: gnuwin32.sourceforge.net/packages/grep.htm
LiuYan 刘 研
3
@userunknown Nun, als Beispiel ist der Befehl unxutils sed älter und unterstützt nicht \ d eg \ d22, um ein Zitat anzugeben. Ein älteres wget lädt möglicherweise keine Seite herunter, die von einer neueren unterstützt wird, und wenn Sie um Unterstützung bitten, werden Sie möglicherweise um die neueste gebeten, da dies einige Probleme lösen kann. Ein wirklich altes Grep wird zweifellos nicht die Regex-Unterstützung haben, die ein aktuelles hat
Barlop
3

Sie können versuchen, Chocolatey unter Windows zu installieren, und dadurch das Gow- Tool installieren . Dies wird Ihnen unter grepWindows zur Verfügung stellen.

Gowsteht für GNU unter Windows. Es bietet Unix-Befehlszeilendienstprogramme unter Windows.

Atur
quelle
1
Es ist ein Paket-Manager, wie ein Apt-Get, aber für Windows. Es hat seinen Namen, weil der Entwickler es von NuGet abgeleitet hat, einem Paketmanager für Visual Studio, und das klingt wie Nugget (wie in Chicken Nugget), also dachte er, er wäre "witzig" oder "klug" und würde anrufen sein Programm Chocolatey NuGet. Ich habe das in einem Podcast gehört, in dem er interviewt wurde. Gow kann auch unabhängig heruntergeladen werden
Barlop
1
Ich bin neu in Gow, und nach ein paar Tagen kann ich bezeugen, dass es mir sehr gut gefällt - es ist besser als alle älteren Ports von UNIX-Utils, die ich zuvor verwendet habe.
Radim Cernej
@RadimCernej Ihr Kommentar ist nur dann nützlich, wenn Sie angeben, wie Sie es für besser halten.
Barlop
@barlop: Seit ich meinen Januar-2016-Kommentar geschrieben habe, bin ich nach und nach und vollständig auf Gow umgestiegen. Bisher keine Bugs, es hat alle Dienstprogramme, die ich brauche / benutze, Pfad werden im Microsoft-Format ausgegeben (was das Kopieren / Einfügen in andere Programme erleichtert). Gow ist nicht-invasiv genug (einfach zu installieren und zu entfernen), so dass ich Ihnen dringend eine Probefahrt empfehle.
Radim Cernej
2

Bash verwenden

$ ls | grep root

Cmd verwenden

> dir /b | findstr root

Dabei /bsteht b für eine Liste von Verzeichnissen und Dateien

vladkras
quelle
2
Dies dupliziert eine andere Antwort und fügt keinen neuen Inhalt hinzu. Bitte posten Sie keine Antwort, es sei denn, Sie haben tatsächlich etwas Neues beizutragen.
DavidPostill
@DavidPostill: Dies ist eine schnelle Lösung für "TL; DR"
-Nutzer
Das ist keine Entschuldigung für das Hinzufügen einer Antwort, die nichts Neues beiträgt. In jedem Fall wird die akzeptierte Antwort immer zuerst angezeigt, damit sie vor Ihrer gelesen wird.
DavidPostill
@ DavidPostill, nichts dagegen, aber akzeptierte Antwort enthalten mehrere übermäßige und unerklärte Schlüssel /B, /Rund /COP nicht gefragt, während meine Antwort genau gleichwertig ist
vladkras
Damit /bwird die dirAusgabe mit der Ausgabe identisch ls. Wenn Sie es testen, werden Sie den Unterschied sehen. Es ist also nicht das genaue Äquivalent.
DavidPostill
2

Ich habe eine Windows-Alternative zu grep mit Hybrid Batch / JScript-Code geschrieben. Ich habe das geschrieben, weil es ein echtes Problem war, die Escape-Zeichen direkt in den GNU-Win32-grep-Port zu bekommen. Diese Version funktioniert weitaus ähnlicher wie die GNU-Version unter 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);
        }
    }

}

Die aktuellste Version finden Sie dazu immer auf meiner Gist- Seite.

krowe
quelle
1

http://www.multireplacer.com

Das Multi-Replacement-Programm wurde so vorbereitet, dass viele Funktionen mithilfe von Befehlszeilenparametern ausgeführt werden können. Die Verwendung der Befehlszeile ist unten dargestellt:

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]
user298490
quelle
0

Sie können Ihre vertrauten grepund anderen Linux-Befehle weiterhin verwenden, indem Sie dieses Tool UnxUtils herunterladen und es Ihrer PATHUmgebungsvariablen hinzufügen

Thucnguyen
quelle
unxutils grep ist nicht so spät wie du bekommen kannst. unx grep ist 2.4.2aber gnuwin32 hat einen späteren 2.5.4
barlop
0

Ich würde empfehlen, busybox-w32 zu verwenden , da es nur etwa 500 KB groß ist und aktiv gewartet wird.

In Ihrem Fall lautet die Eingabeaufforderung wie folgt:

busybox ls | busybox grep root

Sie können doskeyin einer Eingabeaufforderung den Start durch eine Batchdatei verwenden, um einen Befehl zu erstellen, z.

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

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

Dann können Sie ls | grep rootan der Eingabeaufforderung verwenden.

Kusssohn
quelle
Es hat auch einen Android-Build
Barlop
0

Wenn Sie grepIhrer Windows-Umgebung das Einfachste hinzufügen möchten , navigieren Sie c:\windows\system32mit dem folgenden Befehl zu einem kleinen Stapelskript und fügen Sie es hinzu :

echo findstr %1 > grep.bat

Jetzt kannst du

dir | grep notepad.exe

Das ist wirklich eine gruselige Mischung aus Scheiße. Fügen Sie daher ein weiteres Stapelskript hinzu, lswie in diesem Beitrag erläutert

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

Jetzt sieht es ein bisschen vertraut aus

ls | grep notepad

HTH

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

Das wird schnell und schmutzig sein.

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
quelle
Übrigens hat diese langweilige Antwort 44 positive Stimmen auf dem berühmten russischen Entwicklerblog habrahabr.ru/post/71568
vladkras