Windows中是否有类似GREP的模式匹配实用程序?


179

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

Answers:


238

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


7
谢谢!它不是grep,但是我希望能够在其他人的计算机上无需安装其他软件的情况下运行,这会让我感到满意。
sage

42
您也可以将其与管道符号一起使用,例如netstat -n | FINDSTR 3389
harperville 2014年

3
@sage具有一些创造力,findstr的工作原理与grep完全相同。请参考此grep Windows示例
mkyong 2014年

2
@mkyong-我同意。我并不是要暗示它是不完整的,只是它有所不同,并且使用更多的工具需要更多的工作。话虽如此,findstr现在是我在使用其他人的计算机时选择的工具,但是每次使用它时,我都必须刷新自己的语法记忆。
sage 2014年

1
@gonzobrains:只是没有被很好地记录。据我所知,它始终可以在Windows NT命令提示符下使用-当然,它在Windows NT 4中可用,但是我不知道Windows 3.5x。在命令提示符下被认为是这样的“二等公民”,由微软当时说了很多有用的命令行实用程序已经在文件中被忽视☹️
肯·基南

35

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


10
尽管Select-String(alias:sls)使用正则表达式,但它不支持某些基本功能,例如目录递归。为此,您需要组合多个PowerShell命令。像“ dir -R -Include * .txt | sls“ ^ My Regex String $”
yzorg 2011年


27

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

C:> dir | findstr Windows

Windows 11/06/2013 09:55 PM


11

Cygwin grep等;)


2
您不必安装整个Cygwin软件包即可运行Cygwin grep。您只需要大约5个DLL:cygpcre-0.dll,cygpcreposix-0.dll,cygwin1.dll,cygintl-8.dll和cyggce_s-1.dll。
JPaget 2011年

我使用Cygwin很长时间了...最近尝试用Windows-Linux-Subsystems替代...不久以后...回到CYGWIN ...更丰富,更不那么麻烦...只需添加<cygwin > \ bin到路径...,您可以在Windows / Batch / Powershell中使用它的任何软件...在DOS盒中...在Powershell盒中...等等。等等---很棒的工具! !!
ZEE

11

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

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

希望能帮助到你。


10

我很惊讶没有人提到FINDSTR。我不是grep poweruser,但findstr做了我需要的工作,它过滤了文件和stdin,并提供了一些原始的正则表达式支持。随Windows一起提供。(编辑:有人提到了findstr,我想已经很晚了)


5
“没有人提到FINDSTR”-“最佳”答案是大一岁了,的确提到了FINDSTR ...
chiccodoro 2015年

6

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

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


现在似乎可以在choctlatey上使用,因此 cinst GnuWin32 可以快速安装它。
斯图尔特·阿克森

4

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


4

更新:最初询问该问题时并非如此,但现在Microsoft允许用户安装适用于Linux的Windows子系统,然后Windows将运行grep。在PowerShell中,运行:

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

我尝试了它,但是它给出了此错误:'Enable-WindowsOptionalFeature'无法识别为内部或外部命令,可操作程序或批处理文件。谢谢顺便说一句。
Sandun


谢谢。我会尝试的。;)
Sandun


3

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


2

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


1

尽管从技术上讲不是grep或命令行,但Microsoft Visual Studio和Notepad ++都具有很好的“在文件中查找”功能,并具有完整的正则表达式支持。我发现自己经常使用它们,即使我在命令行上也可以使用grep的CygWin版本。


1

我将$ 0.02添加到该线程中。dnGREP是一款出色的Windows grep开源工具,支持撤消,Windows Explorer集成,在PDF,Zip,DOC和其他大量内容中进行搜索...


1

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


1

您显然已经获得了许多不同的建议。
对于免费的第三方实用程序,我个人的选择是:Agent Ransack
Agent Ransack下载
尽管其名称有些令人困惑,但它仍然可以很好地工作并且可以以多种方式用于查找文件。

祝好运





0

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

如果您想节省人工劳动的时间,那就值得了。您可以在购买之前尝试一下。


0

如果必须使用裸机Windows,则除了上面提到的Powershell选项之外,还可以使用VBScript,它具有不错的RegEx支持。

MS在Technet上还有一个不错的脚本编写区域,其中包含大量管理员示例。


0

只需尝试LikeGrep Java实用程序。它在很多情况下都可以为您提供帮助。如您所愿,它也可以替换文件中的某些文本。它保证在大文件上的工作(测试高达8 Gb)


0

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

如果您想要带有图形界面的东西,我建议使用(开源)工具AstroGrep


0

自从我使用它们已经有一段时间了,但是Borland(现在是Embarcadero)在其C / C ++编译器中包含了命令行grep。注册一段时间后,他们已经可以免费下载其5.5版本。



0

我推荐PowerGrep

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

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

Cygwin的grep效果更好,它不会经常阻塞,但是最终我去了PowerGrep,因为图形界面使它更容易分辨何时何地崩溃,而且在所有条件和输出中都非常容易编辑我想了。最终,PowerGrep是三者中最可靠的。


0

我知道这是一个有点老的话题,但是,这是您可以做的另一件事。我在无法访问互联网且可用磁盘空间非常有限的开发人员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


0

我意识到这是一个老问题,但我偶然发现了此帖子以寻求答案。我发现了一个,所以在这里添加它以存储集体的互联网记忆

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

https://docs.microsoft.com/zh-cn/powershell/module/microsoft.powershell.utility/select-string

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

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

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


0

使用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中使用它
(我想这是原始意图;-)

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.