【问题标题】:Is there a Pattern Matching Utility like GREP in Windows?Windows 中是否有类似 GREP 的模式匹配实用程序?
【发布时间】:2010-11-27 19:47:17
【问题描述】:

Windows 命令提示符中是否有与grep 类似的实用程序,或者是否有第三方工具可用?

【问题讨论】:

标签: windows grep


【解决方案1】:

Grep for Windows by GnuWin Project (2014-10-02: 已经过时了,见下面的 cmets)

【讨论】:

  • 这是 GnuWin32 grep。它尚未更新到最新版本的 grep。为此,您必须获得 Cygwin 版本。请参阅下面的评论。
【解决方案2】:

有一个名为 FINDSTR 的命令行工具随所有 Windows NT 类操作系统一起提供(在命令提示符窗口中键入 FINDSTR /? 以获取更多信息)它不支持 grep 所做的一切,但它可能足以满足您的需求。

【讨论】:

  • 谢谢!它不是 grep,但我希望无需在其他人的机器上安装其他软件即可运行,这会让我。
  • 您也可以将它与管道符号一起使用,例如netstat -n | FINDSTR 3389
  • @sage,有一些创造力,findstr 的工作方式与 grep 完全一样。参考这个grep for Windows example
  • @mkyong - 我同意。我并不是说它不完整,只是它不同,使用更多工具需要更多工作。话虽如此,findstr 是我现在使用别人电脑时的首选工具,但每次使用它时我都必须刷新我的语法记忆。
  • @gonzobrains:只是没有很好的记录。据我所知,它总是可以从 Windows NT 命令提示符中使用——当然,它在 Windows NT 4 中是可用的,但我不知道 Windows 3.5x。命令提示符当时被微软视为“二等公民”,以至于文档中忽略了许多有用的命令行实用程序☹️
【解决方案3】:

PowerShell(在 Windows 7/2008R2 上作为标准包含,对于 XP/2003/Vista/2008 是可选的),其中包含用于此目的的 select-string cmdlet。

【讨论】:

  • 虽然 Select-String (alias:sls) 使用正则表达式,但它不支持目录递归等一些基本功能。为此,您需要组合多个 PowerShell 命令。像 "dir -R -Include *.txt | sls "^My Regex String$"
  • 数百个字符可以做非常常见的排除:比如 node_modules 和 .git。见stackoverflow.com/questions/15294836/…
【解决方案4】:

UnxUtils 是一组在 Windows 上运行的 Unix 实用程序。它有grep、sed、gawk等。

【讨论】:

【解决方案5】:

Bare Grep 如果你想要一个 GUI 就很好。 Gnu grep 适合 CLI

【讨论】:

    【解决方案6】:

    如果您不介意付费产品,PowerGREP 是我个人的最爱。

    【讨论】:

      【解决方案7】:

      我们最近使用PowerGREP 对数千个文件进行了一些相当高级的批量操作。包括在 PDF 文件内容中的正则表达式搜索,以及大规模修改 PDF 文档。

      如果您想从人工劳动中节省时间,那么这笔钱是值得的。我认为您可以在购买前尝试一下。

      【讨论】:

        【解决方案8】:

        Cygwin grep 等等 ;)

        【讨论】:

        • 您不必安装整个 Cygwin 软件包即可运行 Cygwin grep。您只需要大约 5 个 DLL:cygpcre-0.dll、cygpcreposix-0.dll、cygwin1.dll、cygintl-8.dll 和 cyggce_s-1.dll。
        • 我使用 Cygwin 很长时间了...最近尝试用 Windows-Linux-Subsystems 代替...没多久...返回 CYGWIN...更丰富,更少更多侵入性...只需将 \bin 添加到路径...您可以在 Windows/Batch/Powershell... 中的任何软件中使用它...在 DOS-Box... 在 Powershell-Box... 等。等等---很棒的工具!!!
        【解决方案9】:

        如果您必须使用裸 Windows,那么除了上面提到的 Powershell 选项之外,您还可以使用 VBScript,它具有良好的 RegEx 支持。

        MS 在 Technet 上也有一个不错的脚本区,为管理员提供大量示例。

        【讨论】:

          【解决方案10】:

          我很惊讶没有人提到FINDSTR。我不是 grep 高级用户,但 findstr 可以满足我的需要,过滤文件和标准输入,并提供一些原始的正则表达式支持。随 Windows 和所有这些一起提供。 (编辑:嗯,有人确实提到了 findstr,我猜已经晚了)

          【讨论】:

            【解决方案11】:

            GnuWin32值得一提,它提供了所有标准linux工具的原生Win32版本,包括grep、file、sed、groff、indent等。

            当这些工具的新版本发布时,它会不断更新。

            【讨论】:

            • 它现在似乎可以在 choclaty 上使用,所以 cinst GnuWin32 可以快速安装它。
            【解决方案12】:

            在 windows reskit 中有一个名为“qgrep”的实用程序。你可能已经把它放在你的盒子上了。 ;-) 它还带有“tail”命令,感谢上帝!

            【讨论】:

              【解决方案13】:

              虽然从技术上讲不是 grep 或命令行,但 Microsoft Visual Studio 和 Notepad++ 都具有非常好的 Find in Files 功能,并具有完整的正则表达式支持。我发现自己经常使用它们,即使我在命令行上也有 CygWin 版本的 grep。

              【讨论】:

                【解决方案14】:

                试试 LikeGrep java 实用程序吧。 在很多情况下它可能会对您有所帮助。 如您所愿,它还可以替换文件中的一些文本。 它保证对大文件的工作(测试高达 8 Gb)

                【讨论】:

                  【解决方案15】:

                  如上所述,gnuwin32 项目有一个 Windows CLI 版本的 grep。

                  如果你想要图形界面的东西,我会推荐(开源)工具AstroGrep

                  【讨论】:

                    【解决方案16】:

                    我已经有一段时间没有使用它们了,但是 Borland(现在是 Embarcadero)在他们的 C/C++ 编译器中包含了一个命令行 grep。一段时间以来,他们在注册后以free download 的形式提供了他们的 5.5 版本。

                    【讨论】:

                      【解决方案17】:

                      我会将我的 0.02 美元添加到此线程。 dnGREP 是一款出色的 Windows 开源 grep 工具,支持撤消、Windows 资源管理器集成、在 PDF、zip、DOC 和其他一堆东西中搜索...

                      【讨论】:

                        【解决方案18】:

                        Oak Road Systems 提供了一个商业 grep 实用程序。

                        【讨论】:

                          【解决方案19】:

                          一个出色且非常快速的文件搜索实用程序Agent Ransack,支持正则表达式搜索。它主要是一个 GUI 实用程序,但也可以使用命令行界面。

                          【讨论】:

                            【解决方案20】:

                            我还发现了另一种在 Windows 7 及更高版本中使用类似 GREP 的功能的方法,无需安装任何额外的应用程序,并且在旧系统上您可以使用安装 Powershell。

                            Powershell,用户可以使用Where-Object,它具有相当全面的功能集,提供了GREP的所有功能以及更多功能。

                            希望对您有所帮助。

                            【讨论】:

                              【解决方案21】:

                              如前所述,findstr 工作正常。示例:

                              C:>目录 | findstr 窗口

                              2013 年 11 月 6 日晚上 9:55 窗口

                              【讨论】:

                                【解决方案22】:

                                一体化busybox包含grep / egrep / sed / awk等等

                                从:

                                更新:不再可用 - 或更旧的版本

                                【讨论】:

                                • 当提问者询问第三方工具时,为什么我会被否决?
                                【解决方案23】:

                                在 Windows 上,我使用 Far Manager 进行文件搜索。 BSD 许可,在控制台中工作,节省输入 cmdline 参数的时间。这是 Alt-F7 调用的搜索对话框。

                                【讨论】:

                                  【解决方案24】:

                                  我推荐PowerGrep

                                  几年前我不得不做一个电子发现项目。我发现fisdstr 有一些限制,尤其是 fisdstr 最终会失败

                                  脚本必须使用几十个搜索词/短语来搜索数千个文件。

                                  Cygwin 的 grep 工作得更好,它并没有经常卡顿,但最终我还是选择了 PowerGrep,因为图形界面可以更容易地判断崩溃的时间和地点,而且真的易于编辑我想要的所有条件和输出。最终,PowerGrep 是三者中最可靠的

                                  【讨论】:

                                    【解决方案25】:

                                    是的,只有一个适用于 Windows PC 的程序具有可靠的 GUI,它对我来说是必不可少的工具。我是一名开发人员,在我拥有的每台计算机上,首先安装 XFind 程序。它创建于 1997 年,到现在为止的版本是 1.0,并且到现在为止,它是最好的。我经常需要在“.cs”、“.aspx”、“.sct”(Visual FoxPro 表单代码文件)或只是“.*”中搜索一些字符串XFind 扫描所有文件并向我显示文件,另一个很棒的事情是您可以查看文件中字符串的位置。 XFind 也有某种编辑器。如果它是二进制文件,它将显示找到的字符串。如果您像我一样是开发人员,请尝试并永远使用它。

                                    【讨论】:

                                      【解决方案26】:

                                      你显然得到了很多不同的建议。
                                      我个人对免费的第 3 方实用程序的选择是:Agent Ransack
                                      Agent Ransack Download
                                      尽管它的名称有些混乱,但它运行良好并且可以以多种方式用于查找文件。

                                      祝你好运

                                      【讨论】:

                                        【解决方案27】:

                                        我知道这是一个有点老的话题,但是你可以做另一件事。我在一个无法访问互联网且可用磁盘空间非常有限的开发人员 VM 上工作,因此我使用了安装在其上的 java。

                                        编译将正则表达式匹配打印到控制台的小型 java 程序。将 jar 放在系统上的某个位置,创建一个批处理来执行它并将文件夹添加到 PATH 变量中:

                                        JGrep.java:

                                        package com.jgrep;
                                        
                                        import java.io.BufferedReader;
                                        import java.io.FileNotFoundException;
                                        import java.io.FileReader;
                                        import java.io.IOException;
                                        import java.util.regex.Matcher;
                                        import java.util.regex.Pattern;
                                        
                                        public class JGrep {
                                        
                                            public static void main(String[] args) throws FileNotFoundException, IOException {
                                                int printGroup = -1;
                                                if (args.length < 2) {
                                                    System.out.println("Invalid arguments. Usage:");
                                                    System.out.println("jgrep [...-MODIFIERS] [PATTERN] [FILENAME]");
                                                    System.out.println("Available modifiers:");
                                                    System.out.println(" -printGroup            - will print the given group only instead of the whole match. Eg: -printGroup=1");
                                                    System.out.println("Current arguments:");
                                                    for (int i = 0; i < args.length; i++) {
                                                        System.out.println("args[" + i + "]=" + args[i]);
                                                    }
                                                    return;
                                                }
                                                Pattern pattern = null;
                                                String filename = args[args.length - 1];
                                                String patternArg = args[args.length - 2];        
                                                pattern = Pattern.compile(patternArg);
                                        
                                                int argCount = 2;
                                                while (args.length - argCount - 1 >= 0) {
                                                    String arg = args[args.length - argCount - 1];
                                                    argCount++;
                                                    if (arg.startsWith("-printGroup=")) {
                                                        printGroup = Integer.parseInt(arg.substring("-printGroup=".length()));
                                                    }
                                                }
                                                StringBuilder sb = new StringBuilder();
                                                try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
                                                    sb = new StringBuilder();
                                                    String line = br.readLine();
                                        
                                                    while (line != null) {
                                                        sb.append(line);
                                                        sb.append(System.lineSeparator());
                                                        line = br.readLine();
                                                    }
                                                }
                                                Matcher matcher = pattern.matcher(sb.toString());
                                                int matchesCount = 0;
                                                while (matcher.find()) {
                                                    if (printGroup > 0) {
                                                        System.out.println(matcher.group(printGroup));
                                                    } else {
                                                        System.out.println(matcher.group());
                                                    }
                                                    matchesCount++;
                                                }
                                                System.out.println("----------------------------------------");
                                                System.out.println("File: " + filename);
                                                System.out.println("Pattern: " + pattern.pattern());
                                                System.out.println("PrintGroup: " + printGroup);
                                                System.out.println("Matches: " + matchesCount);
                                            }
                                        }
                                        

                                        c:\jgrep\jgrep.bat(连同 jgrep.jar):

                                        @echo off
                                        java -cp c:\jgrep\jgrep.jar com.jgrep.JGrep %*
                                        

                                        并在PATH环境变量末尾添加c:\jgrep

                                        现在只需从任何地方拨打jgrep "expression" file.txt

                                        我需要从我的表达式中打印一些特定的组,所以我添加了一个修饰符并将其命名为 jgrep -printGroup=1 "expression" file.txt

                                        【讨论】:

                                          【解决方案28】:

                                          更新:最初问这个问题时这不是真的,但现在微软允许Install the Windows Subsystem for Linux,然后 Windows 将运行 grep。在 PowerShell 中,运行:

                                          Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
                                          

                                          【讨论】:

                                          • 我试过了,但它给出了这个错误:'Enable-WindowsOptionalFeature' 不被识别为内部或外部命令、可运行程序或批处理文件。谢谢顺便说一句。
                                          • 谢谢。我会试试的。 ;)
                                          【解决方案29】:

                                          我意识到这是一个老问题,但我看到这篇文章寻求答案。我找到了一个,所以在这里添加它以供互联网集体记忆

                                          Powershell:选择字符串 模块: Microsoft.PowerShell.Utility

                                          https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-string

                                          以及包含高级示例的信息丰富的博客文章:“如何在 PowerShell 中“grep” https://antjanus.com/blog/web-development-tutorials/how-to-grep-in-powershell/

                                          该博客文章中的一个简单示例: 猫包.json |选择字符串模式 webpack ls ./src/components/ |选择字符串-模式视图

                                          C:> cat post.md |选择字符串-模式“^\w*:”

                                          【讨论】:

                                            【解决方案30】:

                                            使用 Cygwin...

                                            它有 32 位和 64 位版本
                                            它在 Windows 2000 (*) 上运行良好
                                            到 Windows 10 或 Server 2019

                                            我用 Cygwin 很长时间了...
                                            并且最近尝试用 Windows-Linux-Subsystems 代替...

                                            不会太久...
                                            我很快又回到了 Cygwin...

                                            更加灵活、可控和丰富...
                                            侵入性也较小...

                                            只需将 \bin 添加到路径...
                                            并且您可以在 Windows/Batch/Powershell 中以任何方式使用它...
                                            或在 DOS-Box... 或在 Powershell-Box...

                                            您还可以安装大量出色的软件包
                                            真的很管用……就像 nginx 或 PHP 一样…… 我什至在我的 IIS 中使用 Cygwin PHP 包...

                                            作为奖励,您还可以在 bash shell 中使用它...
                                            (我认为这是最初的意图;-))

                                            【讨论】:

                                              猜你喜欢
                                              • 2011-08-20
                                              • 2010-12-12
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 2010-09-12
                                              • 2017-02-23
                                              • 1970-01-01
                                              相关资源
                                              最近更新 更多