Grep equivalent for Windows 7?
Andrew Mclaughlin
Is there a command prompt grep equivalent for Windows 7? That is, I want to filter out the results of a command:
Bash use:
ls | grep root
What would it be from a Windows command prompt?
113 Answers
Findstr sounds like what you want. I use it all the time as an approximate grep-equivalent on the Windows platform.
Another example with pipes:
C:\> dir /B | findstr /R /C:"[mp]" 10 There are several possibilities:
- Use a port of a Unix
grepcommand. There are several choices. Oft-mentioned are GNUWin32, cygwin, and unxutils. Less well known, but in some ways better, are the tools in the SFUA utility toolkit, which run in the Subsystem for UNIX-based Applications that comes right there in the box with Windows 7 Ultimate edition and Windows Server 2008 R2. (For Windows XP, one can download and install Services for UNIX version 3.5.) This toolkit has a large number of command-line TUI tools, frommvanddu, through the Korn and C shells, toperlandawk. It comes in both x86-64 and IA64 flavours as well as x86-32. The programs run in Windows' native proper POSIX environment, rather than with emulator DLLs (such ascygwin1.dll) layering things over Win32. And yes, the toolkit hasgrep, as well as some 300 others. - Use one of the many native Win32
grepcommands that people have written and published. Tim Charron has a native Win32 version of a modified GNU grep, for example. There are also PowerGREP, Bare Grep, grepWin, AstroGrep, and dnGrep, although these are all GUI programs not TUI programs. - Use the supplied
findandfindstr. The syntax is different to that ofgrep, note, as is the regular expression capability.
If PowerShell commands are allowed, use
PS C:\> Get-ChildItem | Select-String rootor short
PS C:\> ls | sls rootBe aware that the alias sls is only defined beginning with PowerShell version 3.0. You may add an alias for less typing:
PS C:\> New-Alias sls Select-StringTo run the PowerShell command directly from cmd, use
C:\>powershell -command "ls | select-string root" 1 In your early revision you wrote MS-DOS, there's only FIND, as far as I know. But it's an ancient OS not used anymore.
In the Windows NT command prompt(e.g. Win2K and win XP and later, so e.g. win7,win10), you can use find and findstr and if you download GnuWin32 then grep
The basic differences are that findstr has some regular expressions support. Grep supports regular expressions best.
C:\>dir | find "abc"
C:\>dir | find /i "abc"find /? and findstr /?shows you what the switches do.
Gnuwin32 has "packages". If you download GnuWin32, I suggest the coreutils package for a bunch of basic useful utilities you'd be familiar with, but grep isn't in that one it's its own package.
Added
GnuWin32's grep, last time I checked, is old. Cygwin's grep is far more up to date. Also bear in mind that many people use Virtual Machines rather than windows ports of *nix commands.
If you would rather use grep, rather than findstr, there is a single .exe file version in UnxUtils, so it's portable and there is no need to install it, or use something like Cygwin.
Bash use
$ ls | grep rootCmd use
> dir /b | findstr rootwhere /b stands for bare list of directories and files
You can try installing Chocolatey on Windows, and through that, install the Gow tool. This will provide you with grep on Windows.
Gow stand for GNU on Windows. It provides Unix command line utilities on Windows.
I wrote a Windows alternative to grep using Hybrid Batch/JScript code. I wrote this because getting the escape characters right in the GNU Win32 grep port was a real pain. This version works much more like how you would want the GNU version to work 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); } }
}You can always find the latest version on my Gist page for this.
Multi replacer program has been prepared so that many functions can be carried out by using command line parameters. Command line usage is seen below:
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] You can still use your familiar grep and other Linux commands by downloading this tool UnxUtils and add it location to your PATH environment variable
I would suggest using busybox-w32, since it is only about 500 KB in size and actively maintained.
So that in your case, in the command prompt, it is:
busybox ls | busybox grep rootYou can use doskey in a command prompt launch by a batch file to make a command, like:
doskey ls="path\to\busybox.exe" ls $*
doskey grep="path\to\busybox.exe" grep $*Then you can use ls | grep root on the command prompt.
If you want to add the simplest grep to your windows environment, then navigate to c:\windows\system32 and add a little batch script by using this command:
echo findstr %1 > grep.batNow you can
dir | grep notepad.exewhich is really a scary mix of shit. So add another batch script for ls as explained in this post
echo dir %1 > %systemroot%\system32\ls.batNow things look a bit familiar
ls | grep notepadHTH
echo findstr %1 %2 %3 %4 %5 > %systemroot%\grep.cmdThat's gonna be quick and dirty equivalent.
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 1