Existe um prompt de comando grep equivalente ao Windows 7? Ou seja, quero filtrar os resultados de um comando:
Uso do Bash:
ls | grep root
O que seria de um prompt de comando do Windows?
Existe um prompt de comando grep equivalente ao Windows 7? Ou seja, quero filtrar os resultados de um comando:
Uso do Bash:
ls | grep root
O que seria de um prompt de comando do Windows?
Respostas:
Findstr soa como o que você deseja. Eu o uso o tempo todo como um equivalente aproximado de grep na plataforma Windows.
Outro exemplo com tubos:
C:\> dir /B | findstr /R /C:"[mp]"
findstr
é que o padrão regex pode não conter alternativas.
findstr
por padrão? Desde o Windows XP ?
Existem várias possibilidades:
grep
comando Unix . Existem várias opções. Muitas vezes mencionados são GNUWin32 , cygwin e unxutils . Menos conhecidas, mas de certa forma melhores, são as ferramentas no kit de ferramentas do utilitário SFUA , que são executadas no Subsistema para Aplicativos Baseados em UNIX, que vem logo ali na caixa com o Windows 7 Ultimate edition e o Windows Server 2008 R2. (No Windows XP, é possível baixar e instalar o Services for UNIX versão 3.5 .) Este kit de ferramentas possui um grande número de ferramentas TUI de linha de comando, de mv
e du
, através dos shells Korn e C, para perl
eawk
. Ele vem nos sabores x86-64 e IA64, bem como no x86-32. Os programas são executados no ambiente POSIX adequado nativo do Windows, em vez de com DLLs de emulador (como cygwin1.dll
) sobrepor coisas no Win32. E sim, o kit de ferramentas possui grep
, além de outras 300.grep
comandos nativos do Win32 que as pessoas escreveram e publicaram. Tim Charron tem uma versão nativa do Win32 de um GNU grep modificado , por exemplo. Também existem PowerGREP , Bare Grep , grepWin , AstroGrep e dnGrep , embora esses sejam todos programas GUI, não programas TUI.find
e findstr
. A sintaxe é diferente da de grep
, observe, assim como o recurso de expressão regular.Se os comandos do PowerShell forem permitidos, use
PS C:\> Get-ChildItem | Select-String root
ou curto
PS C:\> ls | sls root
Esteja ciente de que o alias sls
é definido apenas a partir do PowerShell versão 3.0. Você pode adicionar um alias para digitar menos:
PS C:\> New-Alias sls Select-String
Para executar o comando do PowerShell diretamente do cmd, use
C:\>powershell -command "ls | select-string root"
Na sua revisão inicial, você escreveu o MS-DOS, apenas FIND
, até onde eu sei. Mas é um sistema operacional antigo que não é mais usado.
No prompt de comando do Windows NT (por exemplo, Win2K e ganhar XP e mais tarde, por isso, por exemplo, win7, win10), você pode usar find
e findstr
e se você baixar GnuWin32 seguidagrep
As diferenças básicas são que o findstr tem suporte para expressões regulares . O Grep suporta melhor expressões regulares.
C:\>dir | find "abc"
C:\>dir | find /i "abc"
find /?
e findstr /?
mostra o que os switches fazem.
O Gnuwin32 possui "pacotes". Se você baixar o GnuWin32, sugiro o pacote coreutils para vários utilitários básicos que você já conhece, mas o grep não está nesse, é em seu próprio pacote.
Adicionado
O grep do GnuWin32, da última vez que verifiquei, é antigo. O grep de Cygwin está muito mais atualizado. Lembre-se também de que muitas pessoas usam máquinas virtuais em vez de portas do Windows com comandos * nix.
Se você preferir usar grep
, em vez de findstr
, existe uma .exe
versão de arquivo único no UnxUtils , por isso é portátil e não há necessidade de instalá-lo ou usar algo como Cygwin.
.zip
arquivo de .exe
arquivos. A única pequena desvantagem é que as versões são um pouco antigas.
grep
para o Windows: gnuwin32.sourceforge.net/packages/grep.htm
Você pode tentar instalar o Chocolatey no Windows e, com isso, instalar a ferramenta Gow . Isso fornecerá a você grep
no Windows.
Gow
significa GNU no Windows. Ele fornece utilitários de linha de comando Unix no Windows.
Uso do Bash
$ ls | grep root
Cmd use
> dir /b | findstr root
onde /b
significa b é uma lista de diretórios e arquivos
/B
, /R
e /C
OP não perguntar sobre, enquanto a minha resposta dá exato equivalente
/b
objetivo é tornar a dir
saída igual à ls
saída. Se você testá-lo, verá a diferença. Portanto, não é o equivalente exato.
Eu escrevi uma alternativa do Windows para grep usando código Hybrid Batch / JScript. Eu escrevi isso porque acertar os caracteres de escape na porta grep do GNU Win32 foi uma grande dor. Esta versão funciona muito mais como você deseja que a versão GNU funcione 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ê sempre pode encontrar a versão mais recente na minha página Gist para isso.
O programa de substituição múltipla foi preparado para que muitas funções possam ser executadas usando 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 sugeriria o uso do busybox-w32 , pois ele tem apenas 500 KB e é mantido ativamente.
Portanto, no seu caso, no prompt de comando, é:
busybox ls | busybox grep root
Você pode usar doskey
em um prompt de comando iniciado por um arquivo em lotes para criar 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 você deseja adicionar o mais simples grep
ao seu ambiente Windows, navegue c:\windows\system32
e adicione um pequeno script em lote usando este comando:
echo findstr %1 > grep.bat
Agora você pode
dir | grep notepad.exe
o que é realmente uma mistura assustadora de merda. Portanto, adicione outro script em lote, ls
conforme explicado nesta postagem
echo dir %1 > %systemroot%\system32\ls.bat
Agora as coisas parecem um pouco familiares
ls | grep notepad
HTH
echo findstr %1 %2 %3 %4 %5 > %systemroot%\grep.cmd
Isso será 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