Grep equivalente para Windows 7?

241

¿Existe un símbolo del sistema grep equivalente para Windows 7? Es decir, quiero filtrar los resultados de un comando:

Uso de bash:

ls | grep root

¿Qué sería de un símbolo del sistema de Windows?

chrisjlee
fuente
99
no confunda ms-dos con el símbolo del sistema. + uso de find y Findstr e incluso grep, para windows ... seguramente se encuentra fácilmente con una búsqueda rápida. Incluso hay tablas de comandos equivalentes en Linux y Windows. también tu ejemplo de bash ni siquiera es específico de bash ... solo supongo, * nix OS.
barlop

Respuestas:

280

Findstr suena como lo que quieres. Lo uso todo el tiempo como un equivalente grep aproximado en la plataforma Windows.

Otro ejemplo con tuberías:

C:\> dir /B | findstr /R /C:"[mp]"
Greg Jackson
fuente
Sí, eso parece ser lo que estoy buscando. Entiendo que probablemente hay limitaciones. Lo probaré.
chrisjlee
18
¿Por qué no podrían simplemente llamarlo grep?
Victor Grazi
66
@VictorGrazi En realidad lo hicieron al principio, vea este artículo . Originalmente se llamaba qgrep, pero luego se renombró.
Zitrax
3
El gran problema findstres que el patrón regex puede no contener alternativas.
Wolf
La pregunta es sobre Windows 7, pero ¿qué otras versiones de Windows tienen findstrpor defecto? ¿Desde Windows XP ?
Peter Mortensen el
44

Hay varias posibilidades:

  • Use un puerto de un grepcomando Unix . Hay varias opciones Los mencionados anteriormente son GNUWin32 , cygwin y unxutils . Menos conocidas, pero de alguna manera mejores, son las herramientas en el kit de herramientas de utilidad SFUA , que se ejecutan en el Subsistema para aplicaciones basadas en UNIX que viene en la caja con Windows 7 Ultimate Edition y Windows Server 2008 R2. (Para Windows XP, uno puede descargar e instalar Servicios para UNIX versión 3.5 .) Este conjunto de herramientas tiene una gran cantidad de herramientas TUI de línea de comandos, desde mvy du, a través de los shells Korn y C, hacia perlyawk. Viene en sabores x86-64 e IA64, así como en x86-32. Los programas se ejecutan en el entorno POSIX apropiado nativo de Windows, en lugar de con archivos DLL de emulador (como cygwin1.dll) superponer cosas sobre Win32. Y sí, el kit de herramientas tiene grep, así como unos 300 más.
  • Utilice uno de los muchos grepcomandos nativos de Win32 que la gente ha escrito y publicado. Tim Charron tiene una versión nativa de Win32 de un GNU grep modificado , por ejemplo. También hay PowerGREP , Bare Grep , grepWin , AstroGrep y dnGrep , aunque todos estos son programas GUI, no programas TUI.
  • Use el suministrado findy findstr. La sintaxis es diferente a la de grep, nota, como lo es la capacidad de expresión regular.
JdeBP
fuente
cygwin funcionó bien para mí en Win 7. Necesitaba grep y GnuWin32 grep no funcionó para mí.
Kozuch
Escribe No veo perl en SUA C: \ Windows \ SUA> dir perl * / s / b Archivo no encontrado y ejecutándose, por ejemplo, c shell de SUA No lo veo en / bin
barlop
también escribes que SFUA es de alguna manera mejor. ¿De qué maneras?
barlop
@Kozuch a menos que indique cómo no funcionó, entonces su comentario no es útil
barlop
19

Si los comandos de PowerShell están permitidos, use

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

o corto

PS C:\> ls | sls root

Tenga en cuenta que el alias slssolo se define a partir de PowerShell versión 3.0. Puede agregar un alias para escribir menos:

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

Para ejecutar el comando de PowerShell directamente desde cmd, use

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

En su primera revisión escribió MS-DOS, solo hay FIND, que yo sepa. Pero es un sistema operativo antiguo que ya no se usa.

En el símbolo del sistema de Windows NT (por ejemplo, Win2K y ganar XP y versiones posteriores, así por ejemplo, win7, win10), se puede utilizar findy findstr, y si se descarga GnuWin32 entoncesgrep

Las diferencias básicas son que findtr tiene soporte para algunas expresiones regulares . Grep admite expresiones regulares mejor.

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

find /?y findstr /?te muestra lo que hacen los interruptores.

Gnuwin32 tiene "paquetes". Si descarga GnuWin32, le sugiero el paquete coreutils para un conjunto de utilidades básicas útiles con las que estaría familiarizado, pero grep no está en ese, es su propio paquete.

Adicional

El grep de GnuWin32, la última vez que lo revisé, es viejo. El grep de Cygwin está mucho más actualizado. También tenga en cuenta que muchas personas usan máquinas virtuales en lugar de puertos de Windows de comandos * nix.

barlop
fuente
9

Si prefiere usar grep, en lugar de findstr, hay una .exeversión de archivo único en UnxUtils , por lo que es portátil y no hay necesidad de instalarlo, o usar algo como Cygwin.

paradroid
fuente
Esto es interesante pero requeriría instalar esa herramienta.
chrisjlee
3
@ Chris: No hay instalación. Es solo un .ziparchivo de .exearchivos. El único pequeño inconveniente es que las versiones son un poco antiguas.
paradroid
66
¿Cuál es la desventaja de ser viejo? ¿Puede el software ser viejo? Todos los bytes nuevos.
Usuario desconocido
3
GnuWin32 también proporciona greppara Windows: gnuwin32.sourceforge.net/packages/grep.htm
LiuYan 刘 研
3
@userunknown bien, como ejemplo, el comando unxutils sed es más antiguo y no admite \ d por ejemplo \ d22 para especificar la cotización. Es posible que un wget anterior no descargue una página que una nueva tendrá, y si solicita asistencia técnica, puede solicitarle que obtenga la última, ya que eso puede resolver algunos problemas. Un grep realmente viejo, sin duda, no tendrá el nivel de soporte de
expresiones regulares que
3

Puede intentar instalar Chocolatey en Windows y, a través de eso, instalar la herramienta Gow . Esto te proporcionará grepen Windows.

Gowsignifican GNU en Windows. Proporciona utilidades de línea de comandos de Unix en Windows.

Atur
fuente
1
Es un administrador de paquetes, como un apt-get pero para Windows. Obtuvo su nombre porque el desarrollador lo basó en NuGet, que es un administrador de paquetes para Visual Studio, y eso suena como nugget (como en nugget de pollo), por lo que pensó que sería "divertido" o "inteligente" y llamó su programa Chocolatey NuGet. Escuché eso en un podcast que lo entrevistó. Gow también se puede descargar de forma independiente
barlop
1
Soy nuevo en Gow, después de unos días de uso, puedo testificar que me gusta mucho; es mejor que todos los puertos anteriores de utilidades UNIX que había usado antes.
Radim Cernej
@RadimCernej su comentario no es útil a menos que indique cómo cree que es mejor.
barlop
@barlop: desde que escribí mi comentario de enero de 2016, gradualmente y completamente cambié a Gow. Hasta ahora no hay errores, tiene todas las utilidades que necesito / uso, la ruta se emite en formato Microsoft (lo que facilita copiar / pegar en otros programas). Gow no es lo suficientemente invasivo (fácil de instalar y quitar) que recomiendo encarecidamente que lo pruebe.
Radim Cernej
2

Uso de bash

$ ls | grep root

Uso de Cmd

> dir /b | findstr root

donde /bsignifica b son la lista de directorios y archivos

vladkras
fuente
2
Esto duplica otra respuesta y no agrega contenido nuevo. No publique una respuesta a menos que realmente tenga algo nuevo que aportar.
DavidPostill
@DavidPostill: esta es una solución rápida para usuarios de "TL; DR" (como yo)
vladkras
Eso no es excusa para agregar una respuesta que no aporta nada nuevo. En cualquier caso, la respuesta aceptada siempre aparecerá primero, por lo que se leerá antes que la suya.
DavidPostill
@DavidPostill, no importa, pero la respuesta aceptada contiene varias claves excesivas e inexplicables/B , /Ry /COP no preguntó, mientras que mi respuesta da el equivalente exacto
vladkras
El /bes hacer que la dirsalida sea la misma que la lssalida. Si lo prueba, verá la diferencia. Por lo tanto, no es el equivalente exacto.
DavidPostill
2

Escribí una alternativa de Windows a grep usando el código Hybrid Batch / JScript. Escribí esto porque obtener los caracteres de escape directamente en el puerto grep GNU Win32 fue un verdadero dolor. Esta versión funciona mucho más como desea que funcione la versión GNU en 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);
        }
    }

}

Siempre puedes encontrar la última versión en mi página de Gist para esto.

krowe
fuente
1

http://www.multireplacer.com

El programa de reemplazo múltiple se ha preparado para que se puedan llevar a cabo muchas funciones mediante el uso de parámetros de línea de comandos. El uso de la línea de comando se ve a continuación:

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]
usuario298490
fuente
0

Todavía puede usar sus grepcomandos Linux familiares y otros descargando esta herramienta UnxUtils y agregue su ubicación a su PATHvariable de entorno

Thucnguyen
fuente
unxutils grep no es tan tarde como puedes conseguir ... unx grep es 2.4.2pero gnuwin32 tiene uno más tarde 2.5.4
barlop
0

Sugeriría usar busybox-w32 , ya que solo tiene un tamaño de aproximadamente 500 KB y se mantiene activamente.

Entonces, en su caso, en el símbolo del sistema, es:

busybox ls | busybox grep root

Puede usar doskeyel inicio de un símbolo del sistema mediante un archivo por lotes para hacer un comando, como:

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

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

Luego puede usarlo ls | grep rooten el símbolo del sistema.

Kissson
fuente
también tiene una compilación de Android
barlop
0

Si desea agregar lo más simple grepa su entorno de Windows, navegue c:\windows\system32y agregue un pequeño script por lotes utilizando este comando:

echo findstr %1 > grep.bat

Ahora usted puede

dir | grep notepad.exe

que es realmente una mezcla de mierda que da miedo Entonces agregue otro script por lotes lscomo se explica en esta publicación

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

Ahora las cosas parecen un poco familiares

ls | grep notepad

HTH

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

Eso será equivalente rápido y sucio.

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
fuente
Por cierto, esta respuesta aburrida tiene 44 votos a favor en el famoso blog de desarrollo
vladkras