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?
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?
Risposte:
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]"
findstr
è che il modello regex potrebbe non contenere alternative.
findstr
per impostazione predefinita? Da Windows XP ?
Esistono diverse possibilità:
grep
comando 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 mv
e du
, attraverso le shell Korn e C, a perl
eawk
. È 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.grep
comandi 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.find
e findstr
. La sintassi è diversa da quella di grep
, nota, così come la capacità di espressione regolare.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"
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 find
e findstr
e 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.
Se preferisci usare grep
, piuttosto che findstr
, c'è una .exe
versione a singolo file in UnxUtils , quindi è portatile e non è necessario installarlo o usare qualcosa come Cygwin.
.zip
file di .exe
file. L'unico piccolo inconveniente è che le versioni sono leggermente vecchie.
grep
Windows: gnuwin32.sourceforge.net/packages/grep.htm
Puoi provare a installare Chocolatey su Windows e, tramite quello, installare lo strumento Gow . Questo ti fornirà grep
su Windows.
Gow
sta per GNU su Windows. Fornisce utilità della riga di comando Unix su Windows.
Bash use
$ ls | grep root
Cmd use
> dir /b | findstr root
dove /b
sta per b sono un elenco di directory e file
/B
, /R
e /C
OP non ha chiesto nulla, mentre la mia risposta dà esattamente l' equivalente
/b
è rendere l' dir
output uguale ls
all'output. Se lo provi vedrai la differenza. Quindi non è l'equivalente esatto.
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 .
È 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]
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 doskey
nel 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 root
sul prompt dei comandi.
Se vuoi aggiungere il più semplice grep
al tuo ambiente Windows, vai c:\windows\system32
e 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 ls
come spiegato in questo post
echo dir %1 > %systemroot%\system32\ls.bat
Ora le cose sembrano un po 'familiari
ls | grep notepad
HTH
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