Grep equivalente para o Windows 7?

215

Existe um prompt de comando grep equivalente para o Windows 7? Ou seja, eu quero filtrar os resultados de um comando:

Uso de Bash:

ls | grep root

O que seria de um prompt de comando do Windows?

    
por chrisjlee 22.06.2011 / 22:51

13 respostas

256

Findstr parece com o que você deseja. Eu uso o tempo todo como um equivalente grep aproximado na plataforma Windows.

Outro exemplo com canais:

C:\> dir /B | findstr /R /C:"[mp]"
    
por 22.06.2011 / 23:00
41

Existem várias possibilidades:

  • Use uma porta de um comando grep do Unix. Existem várias opções. Muitas vezes são GNUWin32 , cygwin e unxutils . Menos conhecidas, mas, de certa forma, melhores, são as ferramentas do Kit de ferramentas do utilitário SFUA , que é executado no Subsistema para Aplicativos Baseados no UNIX que vem ali na caixa com o Windows 7 Ultimate edition e Windows Server 2008 R2. (Para o Windows XP, pode-se download e instale Serviços para UNIX versão 3.5 .) Este kit de ferramentas possui um grande número de ferramentas de TUI de linha de comando, de mv e du , através dos shells Korn e C, até perl e awk . Ele vem em ambos os sabores x86-64 e IA64, bem como x86-32. Os programas são executados no ambiente POSIX nativo do Windows, em vez de com as DLLs do emulador (como cygwin1.dll ) em camadas sobre o Win32. E sim, o kit de ferramentas tem grep , além de outros 300.
  • Use um dos muitos comandos nativos Win32 grep que as pessoas escreveram e publicaram. Tim Charron tem uma versão nativa do Win32 de um grep GNU modificado , por exemplo. Há também PowerGREP , Bare Grep , grepWin , AstroGrep e dnGrep , embora estes sejam todos programas GUI e não programas TUI.
  • Use os find e findstr fornecidos. A sintaxe é diferente da grep , note, assim como a capacidade de expressão regular.
por 23.06.2011 / 15:06
17

Se os comandos PowerShell forem permitidos, use

PS C:\> Get-ChildItem | Select-String root

ou curto

PS C:\> ls | sls root

Lembre-se de que o alias sls é definido apenas começando com a versão 3.0 do PowerShell. Você pode adicionar um alias para menos digitação:

PS C:\> New-Alias sls Select-String

Para executar o comando do PowerShell diretamente do cmd, use

C:\>powershell -command "ls | select-string root"
    
por 13.01.2014 / 14:16
15

Na sua revisão inicial você escreveu MS-DOS, há apenas FIND , até onde eu sei. Mas é um antigo sistema operacional não usado mais.

No prompt de comando do Windows NT (por exemplo, Win2K e win XP e posterior, por exemplo, win7, win10), você pode usar find e findstr e se você baixar GnuWin32 então grep

As diferenças básicas são que a findstr tem algum suporte para expressões regulares . O Grep suporta expressões regulares melhor.

C:\>dir | find "abc"
C:\>dir | find /i "abc"

find /? e findstr /? mostram o que os switches fazem.

O Gnuwin32 tem "pacotes". Se você baixar o GnuWin32, eu sugiro o pacote coreutils para um monte de utilitários básicos que você já conhece, mas o grep não é aquele que é o seu próprio pacote.

Adicionado

O grep do GnuWin32, da última vez que verifiquei, é antigo. O grep do Cygwin está muito mais atualizado. Também tenha em mente que muitas pessoas usam Máquinas Virtuais em vez de portas Windows de comandos * nix.

    
por 22.06.2011 / 23:00
9

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

    
por 22.06.2011 / 23:07
3

Você pode tentar instalar o Chocolatey no Windows e, com isso, instalar o Gow . Isso fornecerá grep no Windows.

Gow representa o GNU no Windows. Ele fornece utilitários de linha de comando Unix no Windows.

    
por 11.09.2014 / 07:33
2

Uso de Bash

$ ls | grep root

Cmd use

> dir /b | findstr root

onde /b significa b são lista de diretórios e arquivos

    
por 02.05.2016 / 07:47
2

Eu escrevi uma alternativa do Windows para o grep usando o código Hybrid Batch / JScript. Eu escrevi isso porque pegar os caracteres de escape diretamente na porta do GNU Win32 grep era 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ê sempre pode encontrar a versão mais recente na minha página Gist para isso.

    
por 03.03.2015 / 12:06
1

link

O programa multi-substituidor 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]
    
por 08.02.2014 / 23:15
0

Você ainda pode usar o seu familiar grep e outros comandos do Linux baixando esta ferramenta UnxUtils e adicionando-o ao seu PATH variável de ambiente

    
por 03.09.2014 / 04:48
0

Eu sugeriria usar o busybox-w32 , pois ele tem apenas 500 KB de tamanho e é mantido ativamente.

Para que, no seu caso, no prompt de comando, seja:

busybox ls | busybox grep root

Você pode usar doskey em um prompt de comando iniciado por um arquivo em lote 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.

    
por 12.06.2016 / 14:31
0

Se você quiser adicionar o grep mais simples ao seu ambiente Windows, navegue até 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

que é realmente uma mistura assustadora de merda. Então, adicione outro script em lote para ls , conforme explicado nesta postagem

echo dir %1 > %systemroot%\system32\ls.bat

Agora as coisas parecem um pouco familiares

ls | grep notepad

HTH

    
por 04.07.2017 / 10:34
-2
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
    
por 25.03.2016 / 09:35