¿Equivalente a Grep para Windows 7?
¿Existe un símbolo del sistema grep equivalente para Windows 7? Es decir, quiero filtrar los resultados de un comando:
Bash use:
ls | grep root
¿Qué sería de un símbolo del sistema operativo de Windows?
¿Existe un símbolo del sistema grep equivalente para Windows 7? Es decir, quiero filtrar los resultados de un comando:
Bash use:
ls | grep root
¿Qué sería de un símbolo del sistema operativo de Windows?
(http://technet.microsoft.com/en-us/library/bb490907.aspx) suena como lo que quieres. Lo uso todo el tiempo como un equivalente aproximado del grep en la plataforma Windows. Otro ejemplo con tubos:
C:\> dir /B | findstr /R /C:"[mp]"
Hay varias posibilidades:
grep
. Hay varias opciones. A menudo se mencionan GNUWin32 , cygwin , y unxutils . Menos conocidas, pero en cierto modo mejores, son las herramientas del SFUA utility toolkit , 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 kit de herramientas tiene un gran número de herramientas TUI de línea de comandos, desde mv
y du
, pasando por los shells Korn y C, hasta perl
y awk
. Viene en los sabores x86-64 e IA64, así como en x86-32. Los programas se ejecutan en el entorno POSIX nativo adecuado de Windows, en lugar de con DLLs de emulador (como cygwin1.dll
) que estratifican las cosas sobre Win32. Y sí, el kit de herramientas tiene grep
, así como unos 300 más. grep
que la gente ha escrito y publicado. Tim Charron tiene una versión nativa de Win32 de un grep GNU 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, al igual que 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
sólo se define a partir de la versión 3.0 de PowerShell. Puede agregar un alias para no tener que escribir tanto:
PS C:\> New-Alias sls Select-String
Para ejecutar el comando PowerShell directamente desde cmd, use
C:\>powershell -command "ls | select-string root"
En tu primera revisión escribiste MS-DOS, sólo hay FIND
, hasta donde yo sé. Pero es un antiguo sistema operativo que ya no se usa.
En el símbolo del sistema operativo de Windows NT (por ejemplo, Win2K y win XP y posterior, así que por ejemplo win7,win10), puedes usar find
y findstr
y si descargas GnuWin32 entonces grep
Las diferencias básicas son que findstr tiene soporte para algunas expresiones regulares . Grep soporta mejor las expresiones regulares.
C:\>dir | find "abc"
C:\>dir | find /i "abc"
find /?
y findstr /?
muestra lo que hacen los interruptores.
Gnuwin32 tiene “paquetes”. Si descargas GnuWin32, te sugiero el paquete coreutils para un montón de utilidades básicas útiles con las que estarías familiarizado, pero grep no está en ese, es su propio paquete.
Añadido
El grep de GnuWin32, la última vez que lo comprobé, es antiguo. El grep de Cygwin está mucho más actualizado. También tened en cuenta que mucha gente usa máquinas virtuales en lugar de los puertos de Windows de los comandos de *nix.
Puedes intentar instalar Chocolatey en Windows, y a través de eso, instalar la herramienta Gow . Esto le proporcionará grep
en Windows.
Gow
son las siglas de GNU en Windows. Proporciona utilidades de línea de comandos de Unix en Windows.
Escribí una alternativa de Windows para el grep usando el código Hybrid Batch/JScript. Lo escribí porque conseguir los caracteres de escape en el puerto grep de GNU Win32 fue un verdadero dolor. Esta versión funciona mucho más parecido a como te gustaría que funcionara 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 Gist para esto.
El programa de reemplazo múltiple ha sido preparado para que muchas funciones puedan ser llevadas a cabo usando los parámetros de la línea de comando. El uso de la línea de comandos 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]
Yo sugeriría usar busybox-w32 , ya que sólo tiene un tamaño aproximado de 500 KB y se mantiene activamente.
De modo que en su caso, en la línea de comandos, es:
busybox ls | busybox grep root
Puede usar doskey
en un lanzamiento de la línea de comandos 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 usar ls | grep root
en la línea de comandos.
Si quieres añadir el más simple grep
a tu entorno de Windows, entonces navega a c:\windows\system32
y añade un pequeño script por lotes usando este comando:
echo findstr %1 > grep.bat
Ahora puedes
dir | grep notepad.exe
que es realmente una mezcla de mierda que da miedo. Así que añade otro script de lotes para ls
como se explica en este post
echo dir %1 > %systemroot%\system32\ls.bat
Ahora las cosas se ven un poco familiares
ls | grep notepad
HTH
Puedes seguir usando tu familiar grep
y otros comandos de Linux descargando esta herramienta UnxUtils y añadirla a tu variable de entorno PATH
echo findstr %1 %2 %3 %4 %5 > %systemroot%\grep.cmd
Eso va a ser el 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