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

使用bash:

ls | grep root

Windows命令的作用是什么提示吗?

评论

不要将ms-dos与命令提示符混淆。 +对于Windows,使用find和findstr甚至grep都可以通过快速搜索轻松找到。甚至在linux和Windows中都存在等效命令表。同样,您的bash示例甚至不是特定于bash的。.我想是* nix OS。

#1 楼

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

另一个带有管道的示例:

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


评论


是的,这似乎是我想要的。我了解可能存在限制。我会尝试的。

–chrisjlee
2011年6月22日21:11

他们为什么不能把它叫做grep!

– Victor Grazi
2015年9月8日15:15

@VictorGrazi他们最初确实是这样做的,请参阅本文。它最初名为qgrep-但后来被重命名。

– Zitrax
16年2月1日在14:23

findstr的最大问题是,正则表达式模式可能不包含替代项。

–狼
16年6月16日在13:15

/ R和/ C在这里代表什么?

–莫妮卡的革命
19年2月11日14:21



#2 楼

有几种可能:



使用Unix grep命令的端口。有几种选择。经常提到的是GNUWin32,cygwin和unxutils。 SFUA实用工具包中的工具鲜为人知,但在某些方面却更好,它们在Windows 7 Ultimate Edition和Windows Server 2008 R2的包装盒中的基于UNIX的应用程序子系统中运行。 (对于Windows XP,可以下载并安装UNIX 3.5版的服务。)此工具包具有大量的命令行TUI工具,从mvdu到Korn和C Shell,再到perlawk。它具有x86-64和IA64两种版本以及x86-32。这些程序在Windows的本机POSIX环境中运行,而不是通过Win32上的仿真器DLL(例如cygwin1.dll)进行分层。是的,该工具包具有grep以及其他300个。

使用人们编写和发布的许多本机Win32 grep命令之一。例如,Tim Charron具有修改过的GNU grep的本地Win32版本。也有PowerGREP,Bare Grep,grepWin,AstroGrep和dnGrep,尽管它们都是GUI程序,而不是TUI程序。

请使用提供的findfindstr。语法与grep的语法不同,请注意,正则表达式功能也是如此。


评论


cygwin在Win 7上为我工作得很好。我需要grep,而GnuWin32 grep对我不起作用。

– Kozuch
2014年2月21日,11:58

您写我在SUA C中看不到perl:\ Windows \ SUA> dir perl * / s / b找不到文件并正在运行,例如SUA的C shell我在/ bin中看不到

– barlop
15年5月27日在21:12

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

– barlop
16-4-24在11:17

@Kozuch除非您声明它不起作用,否则您的评论无用

– barlop
16-4-24在11:18



#3 楼

如果允许使用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"


评论


Grep,Powershell方式。 communary.net/2014/11/10/grep-the-powershell-way

–Charles Burge
17年1月9日在22:59

#4 楼

在您的早期版本中,您编写了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端口。

#5 楼

如果您宁愿使用grep而不是findstr,则UnxUtils中只有一个.exe文件版本,因此它是可移植的,不需要安装它,也无需使用Cygwin之类的东西。

评论


这很有趣,但是需要安装该工具。

–chrisjlee
2011年6月22日21:11

@Chris:没有安装。这只是.exe文件的.zip文件。唯一的小缺点是版本略旧。

–天堂
2011年6月22日在21:13



过时的缺点是什么?软件可以旧吗?所有新字节。

–用户未知
2011年6月23日,下午1:43

GnuWin32还为Windows提供了grep:gnuwin32.sourceforge.net/packages/grep.htm

– LiuYan刘研
2011年6月23日在1:54

@user众所周知,例如,unxutils sed命令较旧,不支持\ d例如。 \ d22指定引号。较旧的wget可能不会下载较新的wget的页面,如果您寻求支持,他们可能会要求您获得最新的页面,因为这样可以解决一些问题。毫无疑问,一个真正古老的grep不会具有当前regex支持的水平

– barlop
2014年9月3日在18:59



#6 楼

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

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

评论


这是一个程序包管理器,就像apt-get一样,但是用于Windows。它的名字叫“ cos开发人员”,它是基于Visual Studio的软件包管理器NuGet来开发的,听起来像金块(如鸡块),所以他认为他会“有趣”或“聪明”并打电话给他的程序Chocolatey NuGet。我在采访他的播客中听到了这一消息。 Gow也可以独立下载

– barlop
15年7月29日在0:01



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

– Radio Cernej
16年1月24日在20:23

@RadimCernej,除非您声明自己认为更好,否则您的评论将无用。

– barlop
16年7月18日在15:57



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

– Radio Cernej
16年7月18日在19:35

#7 楼

我使用混合批处理/ JScript代码编写了Windows替代grep的代码。我之所以这样写,是因为在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页面上始终为此找到最新版本。

#8 楼

重击使用

$ ls | grep root


Cmd使用

> dir /b | findstr root


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

评论


这将重复另一个答案,并且不添加任何新内容。除非您确实有新的贡献,否则请不要发布答案。

–DavidPostill♦
16年5月2日在10:04

@DavidPostill:这是“ TL; DR”用户(如我)的快速解决方案

–vladkras
16年5月4日在12:17



这不是添加没有任何新贡献的答案的借口。无论如何,被接受的答案将始终首先出现,因此将在您之前被阅读。

–DavidPostill♦
16年5月4日在12:18



@DavidPostill,不要介意,但是接受的答案包含多个多余的和无法解释的键/ B,/ R和/ C OP没问,而我的答案给出了完全相同的答案

–vladkras
16-5-4在12:37



/ b用于使dir输出与ls输出相同。如果您对其进行测试,将会看到不同之处。因此,它不是完全等效的。

–DavidPostill♦
16年5月4日在12:43



#9 楼

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]


#10 楼

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

评论


unxutils grep并不迟到.. unx grep是2.4.2,但是gnuwin32有一个更高的2.5.4。

– barlop
15年7月29日在0:05

#11 楼

我建议使用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
16年7月18日在15:59

#12 楼

如果要将最简单的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

#13 楼

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


评论


顺便说一句,这个沉闷的答案在著名的俄罗斯开发博客habrahabr.ru/post/71568上有44票赞成

–vladkras
16年5月2日,下午5:53