什么是适用于Windows的好的grep工具?

288

有没有适用于Windows的grep工具推荐?最好能够利用64位操作系统。

我当然知道Cygwin,也找到了PowerGREP,但我想知道是否还有其他不为人知的好工具?

28个回答

345

FINDSTR 功能强大,支持正则表达式,并且已经预装在所有 Windows 机器上,具有优越性。

c:\> FindStr /?

Searches for strings in files.

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file]
        [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
        strings [[drive:][path]filename[ ...]]

  /B         Matches pattern if at the beginning of a line.
  /E         Matches pattern if at the end of a line.
  /L         Uses search strings literally.
  /R         Uses search strings as regular expressions.
  /S         Searches for matching files in the current directory and all
             subdirectories.
  /I         Specifies that the search is not to be case-sensitive.
  /X         Prints lines that match exactly.
  /V         Prints only lines that do not contain a match.
  /N         Prints the line number before each line that matches.
  /M         Prints only the filename if a file contains a match.
  /O         Prints character offset before each matching line.
  /P         Skip files with non-printable characters.
  /OFF[LINE] Do not skip files with offline attribute set.
  /A:attr    Specifies color attribute with two hex digits. See "color /?"
  /F:file    Reads file list from the specified file(/ stands for console).
  /C:string  Uses specified string as a literal search string.
  /G:file    Gets search strings from the specified file(/ stands for console).
  /D:dir     Search a semicolon delimited list of directories
  strings    Text to be searched for.
  [drive:][path]filename
             Specifies a file or files to search.

Use spaces to separate multiple search strings unless the argument is prefixed
with /C.  For example, 'FINDSTR "hello there" x.y' searches for "hello" or
"there" in file x.y.  'FINDSTR /C:"hello there" x.y' searches for
"hello there" in file x.y.

Regular expression quick reference:
  .        Wildcard: any character
  *        Repeat: zero or more occurances of previous character or class
  ^        Line position: beginning of line
  $        Line position: end of line
  [class]  Character class: any one character in set
  [^class] Inverse class: any one character not in set
  [x-y]    Range: any characters within the specified range
  \x       Escape: literal use of metacharacter x
  \<xyz    Word position: beginning of word
  xyz\>    Word position: end of word

示例用法:findstr text_to_find * 或递归搜索 findstr /s text_to_find *


2
FINDSTR缺少的是仅显示包含字符串行数的选项(类似于grep -c)。如果需要此功能,可以使用FIND /C。 - Ra.
11
Findstr不完全支持正则表达式。 - caltuntas
5
原帖子并没有特别要求使用正则表达式! - Ray Hayes
26
好的,findstr并不是grep,正如其他评论者所指出的那样。但是我甚至不知道它的存在,所以感谢您发布它! - T.Rob
2
FindStr,在Windows 7下至少支持使用/R选项的正则表达式。 - mk.
显示剩余11条评论

221

基于评论的建议,我开始使用grepWin,它非常棒并且是免费的。


(我仍然喜欢PowerGREP,但我不再使用它了。)

我知道你已经提到过它,但是PowerGREP真的很棒。

我最喜欢的功能之一是:

  • 右键单击文件夹即可在PowerGREP上运行
  • 使用正则表达式或直接文字查询
  • 指定包含和排除的文件通配符
  • 搜索和替换
  • 预览模式非常好用,因为您可以确保替换的内容是您想要的。

现在我意识到其他grep工具也可以完成以上所有任务。只是PowerGREP将所有功能打包成一个易于使用的GUI。

来自同样精彩的人们,他们推出了RegexBuddy,我并没有任何关联,只是非常喜欢他们的东西。(应该注意的是,RegexBuddy本身包括一个Windows版本的基本grep,价格远低于PowerGREP。)


其他解决方案

现有的Windows命令

在Windows上实现Linux命令

带有图形界面的Grep工具

其他的Grep工具


4
我很希望能找到一个开源的grep图形用户界面,它像PowerGREP一样易于使用且功能齐全,但我还没有找到这样一个 : )。我已经安装了Cygwin并经常使用其中的grep。 - Mark Biek
21
@Wells - 在Windows上使用普通的* nix grep可以免费通过Cygwin或GnuWin32获得。 FindStr和Find也随Windows一起提供。带有出色GUI、替换和集成撤消功能以及许多其他功能的grep...嗯...那需要你额外支付一点费用。 - Mike Clark
11
@Wells,@Mike Clark,@Mark Biek:我想当这个回答发布时,或许在Windows上并没有好用的免费GUI grep工具,但现在已经不是这样了。grepWin拥有此回答中列出的所有功能,并且现在可能还有其他竞争对手。 - John Y
9
@Wells,因为一个Grep工具要159美元而讨厌Windows就像因为地板垫子贵而讨厌汽车一样。 - md1337
9
@Wells和点赞者们:发生了什么矛盾?Windows上有几个其他与Unix / Linux一样免费的GREP工具。实际上,这就是我喜欢Windows生态系统的原因-如果免费是您的主要标准,那么有很多免费的选择,并且该生态系统通常支持向探索扩展功能的付费开发人员支付报酬,例如PowerGREP。PowerGREP可能并非每个人都喜欢(有时其用户界面会让人感到不知所措),但其复杂程度确实具有实用价值。 - gwideman
显示剩余7条评论

115

GrepWin 是免费且开源的(GPL)

输入图像描述

我一直在使用 grepWin,它是由 TortoiseSVN 的其中一位开发者编写的。它可以在 Windows 上胜任工作。


2
它是免费的,能够搜索PowerGrep无法正确执行的隐藏目录/文件... - Jérôme Verstrynge
3
似乎没有命令行界面。 - Andreas Haferburg
2
这很好,但它只提供一行上下文,并且在完成整个搜索之前无法看到该上下文。 - Matthew Lock
2
这似乎是一个不错且简单的工具。但我需要将结果导出到文件,它似乎没有给我导出的选项。仅因为这个原因,我选择了AstroGrep。 - Ross
不在PDF中进行搜索 - JinSnow
显示剩余3条评论

60

更新于2013年7月:

另一个我现在在Windows上经常使用的grep工具是AstroGrep:

AstroGrep awesomeness

它能够展示比命令行grep的--context=NUM更多的内容,这对我非常有价值。
而且它很快。即使在旧电脑上使用非SSD驱动器(我知道,它们曾经使用带有旋转盘片的硬盘,叫做platters,很疯狂吧?)
它是免费的。
它是可移植的(只需解压简单的zip档案)。

原始答案为2008年10月

alt textGnu Grep还可以

你可以在这里下载它:(site ftp)

所有常见选项都在这里。

结合使用gawkxargs(包括'find',来自GnuWin32),你可以像在Unix上一样编写脚本!

另请参阅我用于递归grep的选项

grep --include "*.xxx" -nRHI "my Text to grep" *

1
@eeerahul的链接已恢复,并添加了示例。 - VonC
AstroGrep很好,但不幸的是它目前缺少“查找和替换”功能,这对我来说是无法接受的。 - Łukasz Wiatrak
它缺少“替换”功能。 - XristosK
我刚开始使用它是基于这个推荐。我喜欢上下文功能。 - dmarlow
不在 PDF 文件中搜索 - JinSnow
显示剩余7条评论

32

PowerShell的Select-String命令在v1.0中就很好了,但在v2.0中它显著改进。将PowerShell内置到最近版本的Windows中意味着您在这里的技能将始终有用,无需先安装任何东西。

Select-String添加了新参数:Select-String命令现在支持新参数,例如:

  • -Context:这允许您查看匹配行之前和之后的行
  • -AllMatches:允许您在一行中查看所有匹配项(以前,您只能查看一行中的第一个匹配项)
  • -NotMatch:等同于grep -v o
  • -Encoding:指定字符编码

我发现创建一个函数gcir来执行Get-ChildItem -Recurse .非常方便,可以聪明地正确传递参数,并为Select-String创建一个别名ss。所以你可以写:

gcir *.txt | ss foo


3
grep -R的示例等效命令:Get-ChildItem -recurse -include *.txt | Select-String -CaseSensitive "SomeString"。 - jslatts
6
我很喜欢PS引入的许多功能,但为什么每个命令都比COBOL程序的平均长度还长呢? - evilcandybag
3
感谢强大的自动补全功能,包括参数名称的自动补全,在输入 PowerShell 命令时快速简便,并且我能够轻松读取结果。 - Jay Bazuzi
1
@jslatts:或者您可以使用别名和部分参数名称,它将是 ls . *.txt -r| sls -ca "SomeString" - Rynant
2
现有的别名sls代表Select-String真的太长了吗? - Joey

23

这可能并不完全属于“grep”类别,但在Windows上我无法没有一个叫做AgentRansack的实用程序。它是一个基于GUI的“查找文件”实用程序,支持正则表达式。

只需右键单击文件夹,点击“ransack..”即可查找包含所需内容的文件。它非常快速。


很遗憾,它无法在相关行打开外部文本编辑器。 - Pawel Furmaniak
1
尝试付费版本的Filelocator Pro,这是我使用过的远远最好的grep工具。 - Ian Stanway
Filelocator Pro可以进行替换吗? - alimack
它有一个非常漂亮的界面,它能进行替换吗? - alimack
现在它被称为Filelocator Lite。 - alimack

19

我相信他们现在已经修复了这个问题。我对BareTail的主要抱怨是你不能“过滤”日志以隐藏(不仅仅是着色)不相关的行。 - Ed Brannin
1
您可以使用BareTailPro进行过滤和搜索,但免费版本(BareTail)不支持此功能。 - Clay
4
这在我的 Windows 7 专业版 64 位系统上运行良好。 - cb88
没有找到配置除记事本以外的外部编辑器的选项。 - static void main
在 Windows 8 x64 上运行得非常好 :) - Dylan Watson
显示剩余2条评论

17

PowerShell已经被提到了几次。以下是如何实际使用它进行grepish操作的方法:

Get-ChildItem -recurse -include *.txt | Select-String -CaseSensitive "SomeString"

它会以区分大小写的方式递归搜索当前目录树中所有文本文件,寻找SomeString

更好的方法是运行以下命令:

function pgrep { param([string]$search, [string]$inc) Get-ChildItem -recurse -include $inc | Select-String -CaseSensitive $search }

然后执行:

pgrep SomeStringToSearch *.txt

如果想要更加便利,可以在PowerShell配置文件中添加函数别名,这样就可以减轻没有合适命令行工具的痛苦了。


别名可用于减少打字量。例如,Get-ChildItem有三个lsdirgci - Peter Mortensen

17

我建议使用AstroGrep

它是免费的、开源的,并且有一个简单的界面。我经常使用它来搜索代码。


但它不会在PDF中搜索。 - JinSnow
这个问题已经在另一个答案中得到了解决。 - Peter Mortensen
这是几年后,但现在它可以搜索PDF文件。我正在使用4.4.7版本。它可以使用chocolatey进行安装,使安装变得容易。主要缺点是它是一个GUI,虽然它声称接受命令行参数,但一页命令行帮助非常神秘,没有命令行的定义,只有标志定义,而且我尝试从cmd行中尝试的任何内容都会导致GUI弹出,就好像我没有使用任何参数一样。 - G. Grothendieck

17

在 Windows 上使用 Git = 在 cmd.exe 中使用 grep

我刚发现安装Git会提供一些基本的 Linux 命令:cat、grep、scp以及其他好用的命令。

安装后,将 Git bin 文件夹添加到 PATH 中,然后您的 cmd.exe 就具备了基本的 Linux 功能!

http://code.google.com/p/msysgit/downloads/list?can=3


搞定了!太完美了,现在我已经在系统上拥有了grep而不需要第三方工具。 - himanshuxd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接