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?
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]"
Il y a plusieurs possibilités:
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.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.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.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"
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.
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.
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.
Utilisation de Bash
$ ls | grep root
Cmd use
> dir /b | findstr root
où /b
correspond à b sont une liste de répertoires et de fichiers
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.
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]
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
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.
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
.