Grep equivalente para o Windows 7?


241

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?


9
não confunda ms-dos com o prompt de comando. + o uso de find e findstr e até grep, para windows .. certamente é facilmente encontrado com uma pesquisa rápida. existem até tabelas de comandos equivalentes no linux e no windows. também você exemplo bash não é específico para bash .. apenas suponho, * nix OS.
barlop

Respostas:


280

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]"

Sim, isso parece ser o que estou procurando. Eu entendo que provavelmente há limitações. Vou dar uma chance.
chrisjlee

18
por que eles não podiam simplesmente chamar isso de grep!
Victor Grazi 8/09

6
@VictorGrazi Eles realmente fizeram isso no início, consulte este artigo . Foi originalmente chamado qgrep - mas depois foi renomeado.
Zitrax

3
O grande problema findstré que o padrão regex pode não conter alternativas.
Wolf

A questão é sobre o Windows 7, mas que outras versões do Windows possuem findstrpor padrão? Desde o Windows XP ?
Peter Mortensen

44

Existem várias possibilidades:

  • Use uma porta de um grepcomando 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 mve du, através dos shells Korn e C, para perleawk. 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.
  • Use um dos muitos grepcomandos 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.
  • Use o fornecido finde findstr. A sintaxe é diferente da de grep, observe, assim como o recurso de expressão regular.

O cygwin funcionou muito bem para mim no Win 7. Eu precisava do grep e o GnuWin32 grep não funcionou para mim.
Kozuch 21/02

Você escreve que não vejo perl no SUA C: \ Windows \ SUA> dir perl * / s / b Arquivo não encontrado e em execução, por exemplo, c shell do SUA Não o vejo em / bin
barlop

você também escreve que o SFUA é, de certa forma, melhor. De que maneiras?
barlop

@Kozuch a menos que você indicar como não funcionou, então seu comentário não é útil
barlop

19

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"


17

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 finde findstre 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.


9

Se você preferir usar grep, em vez de findstr, existe uma .exeversão de arquivo único no UnxUtils , por isso é portátil e não há necessidade de instalá-lo ou usar algo como Cygwin.


Isso é interessante, mas exigiria a instalação dessa ferramenta.
chrisjlee

3
@ Chris: Não há instalação. É apenas um .ziparquivo de .exearquivos. A única pequena desvantagem é que as versões são um pouco antigas.
paradroid

6
Qual é a desvantagem de ser velho? O software pode ser antigo? Todos os bytes novos.
usuário desconhecido

3
O GnuWin32 também fornece greppara o Windows: gnuwin32.sourceforge.net/packages/grep.htm
LiuYan

3
@userunknown, como exemplo, o comando unxutils sed é mais antigo e não suporta \ d, por exemplo, \ d22 para especificar cotação. Um wget mais antigo pode não fazer o download de uma página que uma mais recente fará, e se você solicitar suporte, ele poderá solicitar a mais recente, pois isso pode resolver alguns problemas. A grep muito velho, sem dúvida, não terá o nível de apoio regex que um atual tem
barlop

3

Você pode tentar instalar o Chocolatey no Windows e, com isso, instalar a ferramenta Gow . Isso fornecerá a você grepno Windows.

Gowsignifica GNU no Windows. Ele fornece utilitários de linha de comando Unix no Windows.


1
É um gerenciador de pacotes, como um apt-get, mas para Windows. Ele recebeu esse nome porque o desenvolvedor o baseou no NuGet, que é um gerenciador de pacotes do visual studio, e isso soa como pepita (como na pepita de galinha), então ele pensou que seria "engraçado" ou "inteligente" e ligou para seu programa Chocolatey NuGet. Eu ouvi isso em um podcast que o entrevistou. Gow pode ser baixado de forma independente demais
barlop

1
Eu sou novo no Gow, depois de alguns dias de uso, posso testemunhar que gosto muito - é melhor do que todas as portas mais antigas dos utilitários UNIX que eu havia usado antes.
Radim Cernej

@RadimCernej, seu comentário não é útil, a menos que você indique como acha que é melhor.
barlop

@barlop: Desde que escrevi meu comentário de janeiro de 2016, gradualmente e completamente, mudei para o Gow. Até agora, não há bugs, ele tem todos os utilitários que eu preciso / uso, o caminho é produzido no formato Microsoft (facilitando copiar / colar em outros programas). O Gow não é invasivo o suficiente (fácil de instalar e remover), e eu recomendo fortemente que você o teste.
Radim Cernej

2

Uso do Bash

$ ls | grep root

Cmd use

> dir /b | findstr root

onde /bsignifica b é uma lista de diretórios e arquivos


2
Isso duplica outra resposta e não adiciona novo conteúdo. Não poste uma resposta, a menos que você realmente tenha algo novo para contribuir.
DavidPostill

@DavidPostill: Este é solução rápida para "TL; DR" usuários (como eu)
vladkras

Isso não é desculpa para adicionar uma resposta que não contribua com algo novo. De qualquer forma, a resposta aceita sempre aparecerá primeiro e será lida antes da sua.
DavidPostill

@DavidPostill, não se importa, mas a resposta aceito conter várias excessivas e inexplicáveis chaves /B, /Re /COP não perguntar sobre, enquanto a minha resposta dá exato equivalente
vladkras

O /bobjetivo é tornar a dirsaída igual à lssaída. Se você testá-lo, verá a diferença. Portanto, não é o equivalente exato.
DavidPostill

2

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.


1

http://www.multireplacer.com

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]

0

Você ainda pode usar seus grepcomandos familiares e outros comandos do Linux baixando esta ferramenta UnxUtils e adicioná-la local à sua PATHvariável de ambiente


UnxUtils grep não é tão tarde quanto você pode obter .. unx grep é 2.4.2mas GnuWin32 tem um posterior 2.5.4
barlop

0

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 doskeyem 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 rootno prompt de comando.


ele tem uma compilação android também
barlop

0

Se você deseja adicionar o mais simples grepao seu ambiente Windows, navegue c:\windows\system32e 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, lsconforme explicado nesta postagem

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

Agora as coisas parecem um pouco familiares

ls | grep notepad

HTH


-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

By the way, esta resposta maçante tem 44 upvotes na famosa dev russa blogue habrahabr.ru/post/71568
vladkras
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.