Grep equivalente para Windows 7?
Existe um prompt de comando grep equivalente para Windows 7? Ou seja, quero filtrar os resultados de um comando:
Bash use:
ls | grep root
O que seria de um prompt de comando do Windows?
Existe um prompt de comando grep equivalente para Windows 7? Ou seja, quero filtrar os resultados de um comando:
Bash use:
ls | grep root
O que seria de um prompt de comando do Windows?
Findstr soa como o que você quer. Eu uso-o sempre como um equivalente aproximado de grep na plataforma Windows. Outro exemplo com pipes:
C:\> dir /B | findstr /R /C:"[mp]"
Existem várias possibilidades:
grep
. Existem várias opções. Muitas delas são GNUWin32 , cygwin , e unxutils . Menos conhecidas, mas de certa forma melhores, são as ferramentas do SFUA utility toolkit , que correm no Subsystem for UNIX-based Applications que vem logo ali na caixa com Windows 7 Ultimate edition e Windows Server 2008 R2. (Para Windows XP, pode-se descarregar e instalar Serviços para UNIX versão 3.5 ). Este toolkit tem um grande número de ferramentas TUI de linha de comando, desde mv
e du
, através dos shells Korn e C, até perl
e awk
. Vem tanto nos sabores x86-64 e IA64 como no x86-32. Os programas correm no ambiente POSIX nativo do Windows, em vez de com DLLs emuladoras (como o cygwin1.dll
) a colocar coisas sobre o Win32. E sim, o toolkit tem grep
, assim como cerca de 300 outros. grep
que as pessoas escreveram e publicaram. Tim Charron tem uma versão nativa Win32 de um GNU grep modificado , por exemplo. Existem também PowerGREP , Bare Grep , grepWin , AstroGrep , e dnGrep , embora estes sejam todos programas GUI e não programas TUI. find
e findstr
. A sintaxe é diferente da de grep
, note, assim como a capacidade de expressão regular.Se Comandos PowerShell forem permitidos, use
PS C:\> Get-ChildItem | Select-String root
ou abreviatura
PS C:\> ls | sls root
Esteja ciente de que a alcunha sls
só é definida a partir da versão 3.0 do PowerShell. Pode adicionar uma alcunha para menos digitação:
PS C:\> New-Alias sls Select-String
Para executar o comando PowerShell directamente a partir de cmd, use
C:\>powershell -command "ls | select-string root"
Na sua revisão antecipada escreveu MS-DOS, tanto quanto sei, só há FIND
. Mas é um SO antigo que já não é utilizado.
No prompt de comando do Windows NT (e.g. Win2K e win XP e mais tarde, por isso e.g. win7,win10), pode utilizar find
e findstr
e se descarregar GnuWin32 então grep
As diferenças básicas são que findstr tem algum suporte expressões regulares . A grep suporta melhor as expressões regulares.
C:\>dir | find "abc"
C:\>dir | find /i "abc"
find /?
e findstr /?
mostra-lhe o que os switches fazem.
Gnuwin32 tem “pacotes”. Se você descarregar GnuWin32, sugiro o pacote coreutils para um monte de utilitários úteis básicos que você estaria familiarizado, mas o grep não está nesse pacote, é o seu próprio pacote.
Adicionado
O grep do GnuWin32, da última vez que verifiquei, é antigo. O grep do Cygwin está muito mais actualizado. Tenha também em mente que muitas pessoas usam máquinas virtuais em vez de janelas de comandos *nix.
Você pode tentar instalar o Chocolatey no Windows, e através dele, instalar a ferramenta Gow . Isto irá fornecer-lhe grep
no Windows.
Gow
significa GNU no Windows. Ele fornece utilitários de linha de comando Unix no Windows.
Escrevi uma alternativa do Windows ao grep usando código Hybrid Batch/JScript. Eu escrevi isto porque acertar os caracteres de escape no porto GNU Win32 grep foi uma verdadeira dor. Esta versão funciona muito mais como você gostaria que a versão GNU funcionasse no 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);
}
}
}
Você pode sempre encontrar a última versão na minha página Gist para isto.
O programa de substituição múltipla foi preparado para que muitas funções possam ser realizadas utilizando parâmetros de linha de comando. O uso da linha de comando é visto abaixo:
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]
Eu sugeria usar busybox-w32 , uma vez que é apenas cerca de 500 KB em tamanho e mantido activamente.
Para que no seu caso, no prompt de comando, seja:
busybox ls | busybox grep root
Você pode usar doskey
num prompt de comando, lançando por um ficheiro batch para fazer um comando, como:
doskey ls="path\to\busybox.exe" ls $*
doskey grep="path\to\busybox.exe" grep $*
Então você pode usar ls | grep root
no prompt de comando.
Se quiser adicionar o mais simples grep
ao seu ambiente Windows, então navegue até c:\windows\system32
e adicione um pequeno script em lote usando este comando:
echo findstr %1 > grep.bat
Agora pode
dir | grep notepad.exe
que é realmente uma mistura de merda assustadora. Então adicione outro script batch para ls
como explicado neste post
echo dir %1 > %systemroot%\system32\ls.bat
Agora as coisas parecem um pouco familiares
ls | grep notepad
HTH
Pode ainda utilizar os seus comandos familiares grep
e outros comandos Linux descarregando esta ferramenta UnxUtils e adicionar a sua localização à variável de ambiente PATH
echo findstr %1 %2 %3 %4 %5 > %systemroot%\grep.cmd
Vai ser um equivalente rápido e sujo.
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