Grep-equivalent voor Windows 7?
Is er een opdrachtprompt grep -equivalent voor Windows 7? Dat wil zeggen dat ik de resultaten van een opdracht wil filteren:
Bash-gebruik:
ls | grep root
Wat zou het zijn van een Windows opdrachtprompt?
Is er een opdrachtprompt grep -equivalent voor Windows 7? Dat wil zeggen dat ik de resultaten van een opdracht wil filteren:
Bash-gebruik:
ls | grep root
Wat zou het zijn van een Windows opdrachtprompt?
Findstr klinkt als wat je wilt. Ik gebruik het de hele tijd als een grofequivalent op het Windows-platform. Nog een voorbeeld met leidingen:
C:\> dir /B | findstr /R /C:"[mp]"
Er zijn verschillende mogelijkheden:
grep
commando. Er zijn verschillende keuzes. Vaak zijn dat GNUWin32 , cygwin , en unxutils . Minder bekend, maar in sommige opzichten beter, zijn de tools in de SFUA-toolkit , die draaien in het Subsystem for UNIX-based Applications dat daar in de doos met Windows 7 Ultimate edition en Windows Server 2008 R2 wordt geleverd. (Voor Windows XP kan men downloadt en installeert men Services voor UNIX versie 3.5 ). Deze toolkit heeft een groot aantal opdrachtregel-TUI-tools, van mv
en du
, via de Korn en C shells, tot perl
en awk
. Het is verkrijgbaar in zowel x86-64 en IA64-smaak als x86-32. De programma’s draaien in de eigenlijke POSIX-omgeving van Windows, in plaats van met emulator DLL’s (zoals cygwin1.dll
) die dingen in lagen over Win32 verdelen. En ja, de toolkit heeft grep
, evenals zo'n 300 andere. grep
commando’s die mensen hebben geschreven en gepubliceerd. Tim Charron heeft een native Win32 versie van een aangepaste GNU grep , bijvoorbeeld. Er zijn ook PowerGREP , Bare Grep , grepWin , AstroGrep , en dnGrep , hoewel dit allemaal GUI-programma’s zijn die geen TUI-programma’s zijn. find
en findstr
. De syntaxis is anders dan die van grep
, let wel, net als de normale expressiemogelijkheid.Indien PowerShell commando’s zijn toegestaan, gebruik dan
PS C:\> Get-ChildItem | Select-String root
of kort
PS C:\> ls | sls root
Let op dat de alias sls
alleen wordt gedefinieerd vanaf PowerShell versie 3.0. U kunt een alias toevoegen om minder te hoeven typen:
PS C:\> New-Alias sls Select-String
Om het PowerShell commando direct vanuit cmd uit te voeren, gebruik
C:\>powershell -command "ls | select-string root"
In uw vroege revisie schreef u MS-DOS, er is alleen FIND
, voor zover ik weet. Maar het is een oud OS dat niet meer wordt gebruikt.
In de Windows NT commandoprompt (bijvoorbeeld Win2K en win XP en later, dus bijvoorbeeld win7,win10), kun je find
en findstr
gebruiken en als je GnuWin32 downloadt dan grep
De basisverschillen zijn dat findstr een aantal reguliere uitdrukkingen ondersteuning heeft. Grep ondersteunt reguliere uitdrukkingen het beste.
C:\>dir | find "abc"
C:\>dir | find /i "abc"
find /?
en findstr /?
laat zien wat de schakelaars doen.
Gnuwin32 heeft “pakketten”. Als je GnuWin32 downloadt, stel ik voor om het coreutils pakket te downloaden voor een aantal basis nuttige hulpprogramma’s die je wel kent, maar grep zit daar niet in, het is een eigen pakket.
Toegevoegd
GnuWin32’s grep, de laatste keer dat ik het controleerde, is oud. Cygwin’s grep is veel actueler. Hou er ook rekening mee dat veel mensen Virtuele Machines gebruiken in plaats van Windows-poorten van *nix-commando’s.
U kunt proberen Chocolatey op Windows te installeren en vervolgens het hulpprogramma Gow te installeren. Hierdoor krijgt u grep
op Windows.
Gow
staan voor GNU op Windows. Het biedt Unix-opdrachtenregelhulpprogramma’s voor Windows.
Ik heb een Windows alternatief voor grep geschreven met behulp van Hybrid Batch/JScript code. Ik heb dit geschreven omdat het erg moeilijk was om de escape-karakters in de GNU Win32 grep poort te krijgen. Deze versie werkt veel meer zoals je zou willen dat de GNU versie werkt 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);
}
}
}
Je kunt altijd de laatste versie vinden op mijn Gist pagina hiervoor.
http://www.multireplacer.com ](http://www.multireplacer.com)
Multi replacer programma is voorbereid zodat veel functies kunnen worden uitgevoerd door gebruik te maken van opdrachtregelparameters. Het gebruik van de opdrachtregel is hieronder te zien:
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]
Ik stel voor om busybox-w32 te gebruiken, aangezien het slechts ongeveer 500 KB is en actief wordt onderhouden.
Zodat in uw geval, in de opdrachtprompt:
busybox ls | busybox grep root
U kunt doskey
gebruiken in een opdrachtprompt lancering door een batch-bestand om een opdracht te maken, zoals:
doskey ls="path\to\busybox.exe" ls $*
doskey grep="path\to\busybox.exe" grep $*
Dan kunt u ls | grep root
gebruiken op de opdrachtprompt.
Als je de eenvoudigste grep
wilt toevoegen aan je windows omgeving, navigeer dan naar c:\windows\system32
en voeg een klein batch-scriptje toe met dit commando:
echo findstr %1 > grep.bat
Nu kun je
dir | grep notepad.exe
die echt een enge mix van shit is. Dus voeg een ander batch script toe voor ls
zoals uitgelegd in deze post
echo dir %1 > %systemroot%\system32\ls.bat
nu ziet het er een beetje vertrouwd uit
ls | grep notepad
HTH
U kunt nog steeds uw vertrouwde grep
en andere Linux-commando’s gebruiken door deze tool te downloaden UnxUtils en deze locatie toe te voegen aan uw PATH
omgevingsvariabele
echo findstr %1 %2 %3 %4 %5 > %systemroot%\grep.cmd
Dat zal snel en vies zijn.
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