相当于Windows 7的Grep?


238

是否有Windows 7 的命令提示符grep等效?也就是说,我想过滤掉命令的结果:

Bash使用:

ls | grep root

Windows命令提示符会是什么?


9
不要将ms-dos与命令提示符混淆。+使用find和findstr甚至grep,用于Windows ..通过快速搜索肯定很容易找到。在linux和windows中甚至有等效命令表。另外你bash的例子甚至不特定于bash ..只是我想,* nix OS。
barlop 2011年

Answers:


278

Findstr听起来像你想要的。我一直将它用作Windows平台上的近似grep等效项。

管道的另一个例子

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

是的,这似乎是我正在寻找的。我知道可能存在局限性。我试试看。
chrisjlee 2011年

18
为什么他们不能称之为grep!
Victor Grazi

6
@VictorGrazi他们实际上最初做过,看到这篇文章。它最初被命名为qgrep - 但后来被重命名。
Zitrax 2016年

3
最大的问题findstr是正则表达式模式可能不包含替代方案。
Wolf

问题是关于Windows 7,但findstr默认情况下其他版本的Windows有哪些?从Windows XP开始
Peter Mortensen

44

有几种可能性:

  • 使用Unix grep命令的端口。有几种选择。提到的是GNUWin32cygwinunxutilsSFUA实用工具包中的工具不太为人所知,但在某些方面更好,它们运行在基于UNIX的应用程序子系统中,它随附在Windows 7旗舰版和Windows Server 2008 R2的框中。(对于Windows XP,可以下载并安装用于UNIX版本3.5服务的。)该工具包有大量的命令行工具TUI,mvdu通过了Korn和C shell,要perlawk。它有x86-64和IA64两种版本以及x86-32。这些程序在Windows本地适当的POSIX环境中运行,而不是cygwin1.dll在Win32上使用模拟器DLL(例如)分层。是的,该工具包grep以及其他约300个工具包。
  • 使用grep人们编写和发布的许多本机Win32 命令之一。 例如,Tim Charron有一个修改过的GNU grep的原生Win32版本。还有PowerGREPBare GrepgrepWinAstroGrepdnGrep,虽然这些都是GUI程序而不是TUI程序。
  • 使用提供的findfindstrgrep注意, 语法与正则表达式功能不同。

cygwin很好地为Win 7工作。我需要grep和GnuWin32 grep对我不起作用。
Kozuch 2014年

你写的我在SUA C中没有看到perl:\ Windows \ SUA> dir perl * / s / b找不到文件并运行例如
SU的

你还写道,SFUA在某些方面更好。以什么方式?
barlop

@Kozuch,除非你说它不起作用,那么你的评论是没有用的
barlop

19

如果允许PowerShell命令,请使用

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

或短

PS C:\> ls | sls root

请注意,别名sls仅从PowerShell 3.0版开始定义。您可以为较少的输入添加别名:

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

要直接从cmd运行PowerShell命令,请使用

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


17

在你早期的修订中,你写了MS-DOS,FIND据我所知,这是唯一的。但这是一个不再使用的古老操作系统了。

在Windows NT命令提示符下(例如Win2K和win XP及更高版本,例如win7,win10),您可以使用findfindstr,如果您下载GnuWin32然后grep

基本的区别是findstr有一些正则表达式支持。Grep最好支持正则表达式。

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

find /?findstr /?显示开关的功能。

Gnuwin32有“包”。如果您下载GnuWin32,我建议您使用coreutils软件包,以获得一些您熟悉的基本实用工具,但grep不在其中,而是它自己的软件包。

添加

GnuWin32的grep,我上次检查时,已经老了。Cygwin的grep更新了。还要记住,许多人使用虚拟机而不是* nix命令的Windows端口。


9

如果你更愿意使用grep,而不是在UnxUtils中findstr有一个.exe文件版本,那么它是可移植的,不需要安装它,或使用像Cygwin这样的东西。


这很有趣,但需要安装该工具。
chrisjlee 2011年

3
@Chris:没有安装。它只是一个.zip文件.exe文件。唯一的小缺点是版本略显陈旧。
paradroid 2011年

6
变老的缺点是什么?软件可以老吗?所有新鲜字节。
用户不知道

3
GnuWin32还提供grepWindows:gnuwin32.sourceforge.net/packages/grep.htm
刘艳刘研

3
@userunknown,例如,unxutils sed命令较旧,不支持\ d eg \ d22指定quote。较旧的wget可能无法下载较新的页面,如果您要求支持,他们可能会要求您获取最新的页面,因为这可以解决一些问题。毫无疑问,一个非常古老的grep将不具备当前版本所具有的正则表达式支持水平
barlop 2014年

3

您可以尝试在Windows上安装Chocolatey,然后安装Gow工具。这将为您提供grepWindows。

Gow代表Windows上的GNU。它在Windows上提供Unix命令行实用程序。


1
它是一个包管理器,就像apt-get但是对于windows。它的名字是'cos开发人员基于NuGet,它是视觉工作室的包管理器,听起来像金块(如鸡块),所以他认为他“有趣”或“聪明”并打电话他的节目Chocolatey NuGet。我在接受采访的播客上听到了这个消息。Gow也可以单独下载
barlop 2015年

1
我是Gow的新手,经过几天的使用,我可以证明我非常喜欢它 - 它比我以前用过的所有旧的UNIX工具端口都要好。
Radim Cernej 2016年

@RadimCernej您的评论没有用,除非您说明您认为它更好。
barlop

@barlop:自从我写了2016年1月的评论后,我逐渐完全转向Gow。到目前为止没有错误,它具有我需要/使用的所有实用程序,路径以Microsoft格式输出(使其易于复制/粘贴到其他程序)。Gow是非侵入性的(易于安装和移除),我强烈建议您测试它。
Radim Cernej 2016年

2

Bash使用

$ ls | grep root

使用Cmd

> dir /b | findstr root

其中b/b代表目录和文件列表


2
这复制了另一个答案,并没有添加任何新内容。请不要发布答案,除非您确实有新的贡献。
DavidPostill

@DavidPostill:这是“TL; DR”用户(像我一样)的快速解决方案
vladkras 2016年

这不是添加没有任何新内容的答案的借口。在任何情况下,接受的答案将始终首先出现,以便在您的答案之前阅读。
DavidPostill

@DavidPostill,不介意,但接受的答案包含多个过度和原因不明的钥匙/B/R/COP并没有问,而我的回答给了确切的等效
vladkras

/b是使dir输出一样的ls输出。如果你测试它,你会看到差异。所以它不是完全相同的。
DavidPostill

2

我使用Hybrid Batch / JScript代码编写了一个替代grep的Windows替代品。我写这个是因为在GNU Win32 grep端口中获取转义字符是一个真正的痛苦。这个版本更像是你希望GNU版本在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);
        }
    }

}

您始终可以在我的Gist页面上找到最新版本。


1

http://www.multireplacer.com

已经准备好多重替换程序,以便可以使用命令行参数执行许多功能。命令行用法如下所示:

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

您仍然可以grep通过下载此工具UnxUtils并将其添加到PATH环境变量中来使用您熟悉的和其他Linux命令


unxutils grep并不是你得到的晚了.. unx grep是2.4.22.5.4
gnuwin32

0

我建议使用busybox-w32,因为它只有大约500 KB的大小并且积极维护。

因此,在您的情况下,在命令提示符中,它是:

busybox ls | busybox grep root

您可以doskey在命令提示符下使用批处理文件来启动命令,例如:

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

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

然后您可以ls | grep root在命令提示符下使用。


它有一个Android构建
barlop

0

如果要将最简单的添加grep到Windows环境中,请c:\windows\system32使用以下命令导航到并添加一个小批处理脚本:

echo findstr %1 > grep.bat

现在你可以

dir | grep notepad.exe

这真是一个可怕的混合狗屎。因此,添加另一个批处理脚本用于ls在本作解释

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

现在事情看起来有点熟悉了

ls | grep notepad

HTH


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

这将是快速和肮脏的等价物。

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

顺便说一句,这个沉闷的答案有44个赞成俄罗斯着名的开发博客habrahabr.ru/post/71568
vladkras 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.