¿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?
¿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?
Respuestas:
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]"
findstr
es que el patrón regex puede no contener alternativas.
findstr
por defecto? ¿Desde Windows XP ?
Hay varias posibilidades:
grep
comando 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 mv
y du
, a través de los shells Korn y C, hacia perl
yawk
. 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.grep
comandos 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.find
y findstr
. La sintaxis es diferente a la de grep
, nota, como lo es la capacidad de expresión regular.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 sls
solo 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"
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 find
y 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.
Si prefiere usar grep
, en lugar de findstr
, hay una .exe
versión de archivo único en UnxUtils , por lo que es portátil y no hay necesidad de instalarlo, o usar algo como Cygwin.
.zip
archivo de .exe
archivos. El único pequeño inconveniente es que las versiones son un poco antiguas.
grep
para Windows: gnuwin32.sourceforge.net/packages/grep.htm
Puede intentar instalar Chocolatey en Windows y, a través de eso, instalar la herramienta Gow . Esto te proporcionará grep
en Windows.
Gow
significan GNU en Windows. Proporciona utilidades de línea de comandos de Unix en Windows.
Uso de bash
$ ls | grep root
Uso de Cmd
> dir /b | findstr root
donde /b
significa b son la lista de directorios y archivos
/B
, /R
y /C
OP no preguntó, mientras que mi respuesta da el equivalente exacto
/b
es hacer que la dir
salida sea la misma que la ls
salida. Si lo prueba, verá la diferencia. Por lo tanto, no es el equivalente exacto.
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.
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]
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 doskey
el 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 root
en el símbolo del sistema.
Si desea agregar lo más simple grep
a su entorno de Windows, navegue c:\windows\system32
y 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 ls
como se explica en esta publicación
echo dir %1 > %systemroot%\system32\ls.bat
Ahora las cosas parecen un poco familiares
ls | grep notepad
HTH
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