web-dev-qa-db-fra.com

Équivalent Grep pour Windows 7?

Existe-t-il une commande Prompt grep équivalent pour Windows 7? C’est-à-dire que je souhaite filtrer les résultats d’une commande:

Utilisation de Bash:

ls | grep root

Que serait-il à partir d'une invite de commande Windows?

233
chrisjlee

Findstr sonne comme ce que vous voulez. Je l'utilise tout le temps comme un équivalent approximatif de grep sur la plate-forme Windows.

Un autre exemple avec des tuyaux:

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

Il y a plusieurs possibilités:

  • Utilise le port d'une commande Unix grep. Il y a plusieurs choix. On mentionne souvent GNUWin32 , cygwin et unxutils . Les outils de la boîte à outils de l'utilitaire SFUA , qui s'exécutent dans le sous-système pour les applications UNIX , sont moins connus, mais mieux à certains égards. Ils sont fournis avec Windows 7 Ultimate Edition et Windows Server 2008 R2. (Sous Windows XP, vous pouvez télécharger et installer Services pour UNIX version 3.5 .) Ce kit d'outils contient un grand nombre d'outils TUI en ligne de commande, de mv et du, via les shell Korn et C, à Perl et awk. Il vient dans les deux saveurs x86-64 et IA64 aussi bien que x86-32. Les programmes s'exécutent dans l'environnement POSIX propre à Windows, plutôt qu'avec des DLL d'émulateur (telles que cygwin1.dll) en couches sur Win32. Et oui, la boîte à outils a grep, ainsi que 300 autres.
  • Utilisez l'une des nombreuses commandes Win32 grep natives que les utilisateurs ont écrites et publiées. Tim Charron a une version Win32 native d'un GNU grep modifié, par exemple. Il existe également PowerGREP , Bare Grep , grepWin , AstroGrep et dnGrep , bien qu'il s'agisse de programmes à interface graphique et non de programmes TUI.
  • Utilisez les find et findstr fournis. La syntaxe est différente de celle de grep, note, de même que la capacité d'expression régulière.
44
JdeBP

Si les commandes PowerShell sont autorisées, utilisez

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

ou court

PS C:\> ls | sls root

Sachez que l'alias sls est uniquement défini à partir de PowerShell version 3.0. Vous pouvez ajouter un alias pour moins de frappe:

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

Pour exécuter la commande PowerShell directement à partir de cmd, utilisez

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

Dans votre première révision, vous avez écrit MS-DOS, il n'y a que FIND, pour autant que je sache. Mais c'est un ancien système d'exploitation qui n'est plus utilisé.

Dans l'invite de commande Windows NT (Win2K et win XP et versions ultérieures, par exemple win7, win10, par exemple), vous pouvez utiliser find et findstr et si vous téléchargez GnuWin32 puis grep

Les différences fondamentales sont que findstr a un support expressions régulières . Grep supporte mieux les expressions régulières.

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

find /? et findstr /? vous montre ce que font les commutateurs.

Gnuwin32 a des "packages". Si vous téléchargez GnuWin32, je suggère le paquet coreutils pour un ensemble d’utilitaires de base utiles que vous connaissez bien, mais grep n’est pas dans celui-là, c’est son propre paquet.

Ajouté

Le grep de GnuWin32, la dernière fois que j'ai vérifié, est vieux. Le grep de Cygwin est beaucoup plus à jour. Notez également que de nombreuses personnes utilisent des machines virtuelles plutôt que les commandes Windows des commandes * nix.

16
barlop

Si vous préférez utiliser grep plutôt que findstr, il existe une seule version du fichier .exe dans UnxUtils , de sorte qu'il est portable et qu'il n'est pas nécessaire de l'installer ou d'utiliser Cygwin.

9
paradroid

Vous pouvez essayer d’installer Chocolatey sous Windows, puis d’installer l’outil Gow . Ceci vous fournira grep sous Windows.

Gow signifie GNU sous Windows. Il fournit des utilitaires de ligne de commande Unix sous Windows.

3
atur

Utilisation de Bash

$ ls | grep root

Cmd use

> dir /b | findstr root

/b correspond à b sont une liste de répertoires et de fichiers

2
vladkras

J'ai écrit une alternative Windows à grep en utilisant du code hybride Batch/JScript. J'ai écrit ceci parce qu'obtenir les caractères d'échappement directement dans le port GNU Win32 grep était une vraie galère. Cette version fonctionne beaucoup plus exactement comme vous voudriez que la version GNU fonctionne sous 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);
        }
    }

}

Vous pouvez toujours trouver la dernière version sur ma page Gist pour cela.

2
krowe

http://www.multireplacer.com

Le programme de remplacement multiple a été préparé de sorte que de nombreuses fonctions puissent être exécutées à l’aide de paramètres de ligne de commande. L'utilisation de la ligne de commande est vue ci-dessous:

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]
1
user298490

Si vous souhaitez ajouter la grep la plus simple à votre environnement Windows, accédez à c:\windows\system32 et ajoutez un petit script batch en utilisant la commande suivante:

echo findstr %1 > grep.bat

Maintenant vous pouvez

dir | grep notepad.exe

qui est vraiment un mélange effrayant de merde. Donc, ajoutez un autre script batch pour ls comme expliqué dans ce post

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

Maintenant, les choses semblent un peu familier

ls | grep notepad

HTH

0
domih

Je suggérerais d’utiliser busybox-w32 , car sa taille n’est que d’environ 500 Ko et est activement entretenu.

Ainsi, dans votre cas, dans l'invite de commande, il s'agit de:

busybox ls | busybox grep root

Vous pouvez utiliser doskey dans une invite de commande lancée par un fichier de commandes pour créer une commande, telle que:

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

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

Ensuite, vous pouvez utiliser ls | grep root dans la commande Invite.

0
kissson

Vous pouvez toujours utiliser votre grep et d’autres commandes Linux connues en téléchargeant cet outil UnxUtils et ajoutez-le à la variable d’environnement PATH.

0
thucnguyen