Grep equivalente per Windows 7?


241

Esiste un prompt dei comandi grep equivalente per Windows 7? Cioè, voglio filtrare i risultati di un comando:

Uso Bash:

ls | grep root

Cosa sarebbe da un prompt dei comandi di Windows?


9
non confondere ms-dos con il prompt dei comandi. + l'uso di find and findstr e persino grep, per windows .. è sicuramente facile da trovare con una rapida ricerca. ci sono anche tabelle di comandi equivalenti in Linux e Windows. anche tu l'esempio bash non è nemmeno specifico per bash .. suppongo, * nix OS.
barlop

Risposte:


280

Findstr suona come quello che vuoi. Lo uso sempre come equivalente approssimativo grep sulla piattaforma Windows.

Un altro esempio con i tubi:

C:\> dir /B | findstr /R /C:"[mp]"

Sì, sembra essere quello che sto cercando. Capisco che ci sono probabilmente dei limiti. Lo proverò.
chrisjlee,

18
perché non potevano semplicemente chiamarlo grep!
Victor Grazi,

6
@VictorGrazi Inizialmente lo hanno fatto, vedi questo articolo . Inizialmente si chiamava qgrep, ma in seguito fu ribattezzato.
Zitrax,

3
Il grosso problema findstrè che il modello regex potrebbe non contenere alternative.
Lupo,

La domanda riguarda Windows 7, ma quali altre versioni di Windows hanno findstrper impostazione predefinita? Da Windows XP ?
Peter Mortensen,

44

Esistono diverse possibilità:

  • Utilizzare una porta di un grepcomando Unix . Ci sono diverse scelte Spesso menzionati sono GNUWin32 , cygwin e unxutils . Meno noti, ma in qualche modo migliori, sono gli strumenti nel toolkit di utilità SFUA , che vengono eseguiti nel sottosistema per applicazioni basate su UNIX che è disponibile nella confezione con Windows 7 Ultimate Edition e Windows Server 2008 R2. (Per Windows XP, è possibile scaricare e installare i Servizi per UNIX versione 3.5 .) Questo toolkit ha un gran numero di strumenti TUI da riga di comando, da mve du, attraverso le shell Korn e C, a perleawk. È disponibile in entrambi i gusti x86-64 e IA64 e x86-32. I programmi vengono eseguiti nell'ambiente POSIX nativo di Windows, anziché con le DLL dell'emulatore (come cygwin1.dll) che sovrappongono le cose su Win32. E sì, il toolkit ha grep, oltre a circa 300 altri.
  • Utilizzare uno dei tanti grepcomandi nativi Win32 che le persone hanno scritto e pubblicato. Tim Charron ha una versione nativa di Win32 di un grep GNU modificato , per esempio. Ci sono anche PowerGREP , Bare Grep , grepWin , AstroGrep , e dnGrep , anche se questi sono tutti i programmi con interfaccia grafica non i programmi TUI.
  • Utilizzare il fornito finde findstr. La sintassi è diversa da quella di grep, nota, così come la capacità di espressione regolare.

cygwin ha funzionato bene per me su Win 7. Avevo bisogno di grep e GnuWin32 grep non ha funzionato per me.
Kozuch,

Scrivi che non vedo perl in SUA C: \ Windows \ SUA> dir perl * / s / b File non trovato e funzionante ad es. C shell di SUA Non lo vedo in / bin
barlop

scrivi anche che SFUA è in qualche modo migliore. In che modo?
barlop

@Kozuch a meno che non dichiari come non ha funzionato, il tuo commento non è utile
barlop

19

Se i comandi di PowerShell sono consentiti, utilizzare

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

o breve

PS C:\> ls | sls root

Tenere presente che l'alias slsè definito solo a partire dalla versione 3.0 di PowerShell. È possibile aggiungere un alias per una digitazione minore:

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

Per eseguire il comando PowerShell direttamente da cmd, utilizzare

C:\>powershell -command "ls | select-string root"


17

Nella tua prima revisione hai scritto MS-DOS, ce n'è solo FIND, per quanto ne so. Ma è un sistema operativo antico non più utilizzato.

Nel prompt dei comandi di Windows NT (ad esempio Win2K e Win XP e versioni successive, quindi ad esempio Win7, Win10), è possibile utilizzare finde findstre se si scarica GnuWin32 alloragrep

Le differenze di base sono che findstr ha un supporto per le espressioni regolari . Grep supporta meglio le espressioni regolari.

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

find /?e findstr /?ti mostra cosa fanno gli switch.

Gnuwin32 ha "pacchetti". Se scarichi GnuWin32, ti suggerisco il pacchetto coreutils per un mucchio di utilità di base che potresti avere familiarità, ma grep non è in quello è il suo pacchetto.

aggiunto

Il grep di GnuWin32, l'ultima volta che ho controllato, è vecchio. Il grep di Cygwin è molto più aggiornato. Ricorda inoltre che molte persone usano le macchine virtuali anziché le porte di Windows dei comandi * nix.


9

Se preferisci usare grep, piuttosto che findstr, c'è una .exeversione a singolo file in UnxUtils , quindi è portatile e non è necessario installarlo o usare qualcosa come Cygwin.


Questo è interessante ma richiederebbe l'installazione di quello strumento.
chrisjlee,

3
@Chris: non c'è installazione. È solo un .zipfile di .exefile. L'unico piccolo inconveniente è che le versioni sono leggermente vecchie.
paradroid,

6
Qual è il rovescio della medaglia di essere vecchio? Il software può essere vecchio? Tutti i byte freschi.
utente sconosciuto il

3
GnuWin32 fornisce anche grepWindows: gnuwin32.sourceforge.net/packages/grep.htm
LiuYan 刘 研

3
@userunk È noto, ad esempio, il comando sed di unxutils è più vecchio e non supporta \ d eg \ d22 per specificare il preventivo. Una wget più vecchia potrebbe non scaricare una pagina che verrà lanciata da una più recente e, se chiedi supporto, potrebbero chiederti di ottenere quella più recente in quanto ciò può risolvere alcuni problemi. Un vero grep senza dubbio non avrà il livello di supporto regex di quello attuale
barlop

3

Puoi provare a installare Chocolatey su Windows e, tramite quello, installare lo strumento Gow . Questo ti fornirà grepsu Windows.

Gowsta per GNU su Windows. Fornisce utilità della riga di comando Unix su Windows.


1
È un gestore di pacchetti, come un apt-get ma per Windows. Ha preso il nome perché lo sviluppatore lo ha basato su NuGet, che è un gestore di pacchetti per Visual Studio, e suona come una pepita (come nella pepita di pollo), quindi ha pensato che sarebbe stato "divertente" o "intelligente" e chiamerebbe il suo programma Chocolatey NuGet. L'ho sentito su un podcast che lo ha intervistato. Anche Gow può essere scaricato in modo indipendente
barlop

1
Sono nuovo di Gow, dopo alcuni giorni di utilizzo posso testimoniare che mi piace molto - è meglio di tutte le vecchie porte delle utility UNIX che avevo usato prima.
Radim Cernej,

@RadimCernej il tuo commento non è utile a meno che non dichiari come pensi che sia migliore.
barlop

@barlop: da quando ho scritto il mio commento di gennaio 2016, sono passato gradualmente e completamente a Gow. Finora nessun bug, ha tutte le utilità di cui ho bisogno / utilizzo, il percorso viene emesso in formato Microsoft (facilitando la copia / incolla in altri programmi). Gow è abbastanza non invasivo (facile da installare e rimuovere) che consiglio vivamente di testarlo.
Radim Cernej,

2

Bash use

$ ls | grep root

Cmd use

> dir /b | findstr root

dove /bsta per b sono un elenco di directory e file


2
Questo duplica un'altra risposta e non aggiunge nuovi contenuti. Per favore, non pubblicare una risposta a meno che tu non abbia effettivamente qualcosa di nuovo da contribuire.
DavidPostill

@DavidPostill: questa è una soluzione rapida per utenti "TL; DR" (come me)
vladkras

Questa non è una scusa per aggiungere una risposta che non contribuisce a nulla di nuovo. In ogni caso la risposta accettata apparirà sempre per prima, quindi verrà letta prima della tua.
DavidPostill

@DavidPostill, non importa, ma la risposta accettata contiene più chiavi eccessive e inspiegabili/B , /Re /COP non ha chiesto nulla, mentre la mia risposta dà esattamente l' equivalente
vladkras

Lo scopo /bè rendere l' diroutput uguale lsall'output. Se lo provi vedrai la differenza. Quindi non è l'equivalente esatto.
DavidPostill

2

Ho scritto un'alternativa di Windows a grep usando il codice Hybrid Batch / JScript. Ho scritto questo perché ottenere i caratteri di escape proprio nella porta grep GNU Win32 è stato un vero dolore. Questa versione funziona in modo molto simile a come vorresti che la versione GNU funzionasse in 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);
        }
    }

}

Per questo puoi sempre trovare l'ultima versione sulla mia pagina Gist .


1

http://www.multireplacer.com

È stato preparato un programma per la sostituzione multipla che consente di eseguire molte funzioni utilizzando i parametri della riga di comando. Di seguito è riportato l'utilizzo della riga di comando:

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

Puoi ancora utilizzare i tuoi grepcomandi familiari e altri comandi Linux scaricando questo strumento UnxUtils e aggiungendolo alla PATHvariabile di ambiente


unxutils grep non è il più tardi possibile ... unx grep lo è 2.4.2ma gnuwin32 ne ha uno successivo 2.5.4
barlop

0

Suggerirei di utilizzare busybox-w32 , poiché ha solo una dimensione di circa 500 KB e viene gestito attivamente.

In modo che nel tuo caso, nel prompt dei comandi, sia:

busybox ls | busybox grep root

È possibile utilizzare doskeynel prompt dei comandi l'avvio da un file batch per eseguire un comando, ad esempio:

doskey ls="path\to\busybox.exe" ls $*

doskey grep="path\to\busybox.exe" grep $*

Quindi è possibile utilizzare ls | grep rootsul prompt dei comandi.


ha anche un androide build
barlop

0

Se vuoi aggiungere il più semplice grepal tuo ambiente Windows, vai c:\windows\system32e aggiungi un piccolo script batch usando questo comando:

echo findstr %1 > grep.bat

Ora puoi

dir | grep notepad.exe

che è davvero un mix spaventoso di merda. Quindi aggiungi un altro script batch per lscome spiegato in questo post

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

Ora le cose sembrano un po 'familiari

ls | grep notepad

HTH


-2
echo findstr %1 %2 %3 %4 %5 > %systemroot%\grep.cmd

Sarà equivalente veloce e sporco.

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

A proposito, questa noiosa risposta ha 44 voti positivi sul famoso blog di sviluppo
vladkras
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.