Équivalent Grep pour Windows 7?


241

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

Utilisation Bash:

ls | grep root

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


9
ne confondez pas ms-dos avec l'invite de commande. + utilisation de find and findstr et même de grep, pour Windows .. se trouve facilement avec une recherche rapide. il existe même des tables de commandes équivalentes sous Linux et Windows. aussi votre exemple bash n’est même pas spécifique à bash .. je suppose juste, * nix OS.
Barlop

Réponses:


280

Findstr ressemble à 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]"

Oui, cela semble être ce que je recherche. Je comprends qu'il y a probablement des limites. Je vais essayer.
Chrisjlee

18
pourquoi ne pourraient-ils pas simplement l'appeler grep!
Victor Grazi

6
@VictorGrazi Ils l'ont fait au début, voir cet article . Il s'appelait à l'origine qgrep - mais a ensuite été renommé.
Zitrax

3
Le gros problème findstrest que le motif regex peut ne pas contenir d'alternatives.
Wolf

La question concerne Windows 7, mais quelles autres versions de Windows ont findstrpar défaut? Depuis Windows XP ?
Peter Mortensen

44

Il y a plusieurs possibilités:

  • Utilisez le port d'une grepcommande Unix . 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 et fournis avec Windows 7 Édition Intégrale et Windows Server 2008 R2 , sont moins connus mais, à certains égards, mieux . (Sous Windows XP, vous pouvez télécharger et installer Services for UNIX version 3.5 .) Cette boîte à outils contient un grand nombre d’outils TUI en ligne de commande, depuis mvet à dutravers les shells Korn et C, vers perletawk. 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 et naturel de Windows, plutôt qu'avec des DLL d'émulateur (telles que des cygwin1.dllcouches superposées sur Win32). Et oui, la boîte à outils a grep, ainsi que 300 autres.
  • Utilisez l’une des nombreuses grepcommandes Win32 natives que les utilisateurs ont écrites et publiées. Tim Charron a par exemple une version Win32 native d’un grap GNU modifié . 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 le fourni findet findstr. La syntaxe est différente de celle de grep, note, de même que la capacité d'expression régulière.

cygwin a bien travaillé pour moi sur Win 7. J'avais besoin de grep et GnuWin32 grep ne fonctionnait pas pour moi.
Kozuch

Vous écrivez que je ne vois pas perl dans SUA C: \ Windows \ SUA> dir perl * / s / b Fichier non trouvé et en cours d’exécution, par exemple, shell c de SUA, je ne le vois pas dans / bin
barlop

vous écrivez également que la SFUA est à certains égards meilleure. De quelle manière?
barlop

@ Kozuch, à moins que vous n'indiquiez comment cela n'a pas fonctionné, votre commentaire n'est pas utile
barlop

19

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 slsn'est défini qu'à 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"

2
Grep, à la manière de Powershell. communary.net/2014/11/10/grep-the-powershell-way
Charles Burge

17

Dans votre première révision, vous avez écrit MS-DOS, il n'y en 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 (par exemple Win2K et gagner XP et versions ultérieures, donc par exemple win7, win10), vous pouvez utiliser findet findstrsi vous téléchargez GnuWin32 puisgrep

Les différences fondamentales sont que findstr prend en charge certaines 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ée

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.


9

Si vous préférez utiliser grepplutôt qu’une version de fichier findstrunique .exedans UnxUtils , elle est donc portable et il n’est pas nécessaire de l’installer, ni d’utiliser quelque chose comme Cygwin.


Ceci est intéressant mais nécessiterait l’installation de cet outil.
Chrisjlee

3
@Chris: Il n'y a pas d'installation. C'est juste un .zipfichier de .exefichiers. Le seul petit inconvénient est que les versions sont légèrement anciennes.
paradroid

6
Quel est l'inconvénient d'être vieux? Le logiciel peut-il être vieux? Tous les octets frais.
utilisateur inconnu

3
GnuWin32 fournit également greppour Windows: gnuwin32.sourceforge.net/packages/grep.htm
LiuYan

3
@userunknown bien, par exemple, la commande unxutils sed est plus ancienne et ne prend pas en charge \ d eg \ d22 pour spécifier un devis. Un ancien wget ne téléchargera peut-être pas une page plus récente et, si vous demandez de l'aide, il vous demandera peut-être de vous procurer la dernière, car cela peut résoudre certains problèmes. Un très vieux grep n'aura sans doute pas le niveau de support regex actuel
barlop

3

Vous pouvez essayer d'installer Chocolatey sous Windows et, par la même occasion, installer l' outil Gow . Cela vous fournira avec grepWindows.

Gowstand pour GNU sous Windows. Il fournit des utilitaires de ligne de commande Unix sous Windows.


1
C'est un gestionnaire de paquets, comme un apt-get mais pour Windows. Il tire son nom parce que le développeur l’a basé sur NuGet, un gestionnaire de paquets pour Visual Studio, et cela ressemble à une pépite (comme dans une pépite de poulet). Il a donc pensé qu'il serait "drôle" ou "intelligent" et son programme Chocolatey NuGet. J'ai entendu cela sur un podcast qui l'a interviewé. Gow peut aussi être téléchargé indépendamment
barlop

1
Je suis nouveau chez Gow, après quelques jours d'utilisation, je peux témoigner que je l'aime beaucoup - il est meilleur que tous les anciens ports d'utilitaires UNIX que j'avais utilisés auparavant.
Radim Cernej le

@RadimCernej votre commentaire n'est utile que si vous indiquez en quoi vous pensez qu'il est meilleur.
barlop

@barlop: Depuis que j'ai écrit mon commentaire de janvier 2016, je suis progressivement et complètement passé à Gow. Jusqu'à présent, pas de bugs, il contient tous les utilitaires dont j'ai besoin / utiliser, les chemins d'accès sont générés au format Microsoft (ce qui facilite la copie / collage dans d'autres programmes). Gow est suffisamment peu invasif (facile à installer et à retirer) pour que je vous recommande fortement de le tester.
Radim Cernej

2

Utilisation Bash

$ ls | grep root

Cmd utilisation

> dir /b | findstr root

/best synonyme de b sont la liste des répertoires et fichiers


2
Cela duplique une autre réponse et n’ajoute aucun nouveau contenu. S'il vous plaît, ne postez pas de réponse, sauf si vous avez réellement quelque chose de nouveau à contribuer.
DavidPostill

@ DavidPostill: C'est une solution rapide pour les utilisateurs "TL; DR" (comme moi)
vladkras

Ce n’est pas une excuse pour ajouter une réponse qui n’apporte rien de nouveau. Dans tous les cas, la réponse acceptée apparaîtra toujours en premier, elle sera donc lue avant la vôtre.
DavidPostill

@ DavidPostill, ne vous dérange pas, mais la réponse acceptée contient plusieurs clés excessives et inexpliquées/B , /Ret /COP n'a pas posé de question, alors que ma réponse donne l' équivalent exact
vladkras

Le /best de rendre la dirsortie identique à la lssortie. Si vous le testez, vous verrez la différence. Ce n'est donc pas l'équivalent exact.
DavidPostill

2

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 grep GNU Win32 était une vraie douleur. Cette version fonctionne beaucoup plus 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.


1

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]

0

Vous pouvez toujours utiliser vos commandes habituelles grepet d'autres commandes Linux en téléchargeant cet outil UnxUtils et en l'ajoutant à l'emplacement de votre PATHvariable d'environnement.


unxutils grep n'est pas aussi tard que vous pouvez l'obtenir .. unx grep l'est 2.4.2mais gnuwin32 en a un plus tard 2.5.4
barlop

0

Je suggérerais d'utiliser busybox-w32 , car sa taille n'est que d'environ 500 Ko et qu'il est maintenu activement.

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

busybox ls | busybox grep root

Vous pouvez utiliser doskeyune 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 rootsur l'invite de commande.


il a aussi une construction androïde
barlop

0

Si vous souhaitez ajouter le plus simple grepà votre environnement Windows, recherchez c:\windows\system32et ajoutez un petit script batch en utilisant cette commande:

echo findstr %1 > grep.bat

Maintenant vous pouvez

dir | grep notepad.exe

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

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

Maintenant, les choses semblent un peu familier

ls | grep notepad

HTH


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

Ce sera un équivalent rapide et sale.

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

Soit dit en passant, cette réponse terne a 44 upvotes sur le célèbre blog de russe dev habrahabr.ru/post/71568
vladkras
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.