2011-06-22 20:51:57 +0000 2011-06-22 20:51:57 +0000
246
246

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?

Respostas (13)

287
287
287
2011-06-22 21:00:56 +0000

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]"
45
45
45
2011-06-23 13:06:17 +0000

Existem várias possibilidades:

  • Utilizar um porto de um comando Unix 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.
  • Utiliza um dos muitos comandos nativos Win32 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.
  • Utilize os find e findstr. A sintaxe é diferente da de grep, note, assim como a capacidade de expressão regular.
19
19
19
2014-01-13 13:16:43 +0000

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"
18
18
18
2011-06-22 21:00:57 +0000

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.

9
9
9
2011-06-22 21:07:43 +0000

Se preferir utilizar grep, em vez de findstr, existe uma única versão do ficheiro .exe em UnxUtils , por isso é portátil e não há necessidade de o instalar, ou utilizar algo como o Cygwin.

3
3
3
2014-09-11 05:33:28 +0000

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.

2
2
2
2016-05-02 05:47:50 +0000

Bash use*

$ ls | grep root

Cmd use

> dir /b | findstr root

onde /b significa b são listas de directórios e ficheiros

2
2
2
2015-03-03 11:06:06 +0000

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.

1
1
1
2014-02-08 22:15:42 +0000

http://www.multireplacer.com

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]
0
0
0
2016-06-12 12:31:27 +0000

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.

0
0
0
2017-07-04 08:34:21 +0000

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

0
0
0
2014-09-03 02:48:08 +0000

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

-2
-2
-2
2016-03-25 08:35:24 +0000
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