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


当前回答

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

其他回答

我知道这是一个有点老的话题,但是,还有一件事你可以做。我在一个开发人员虚拟机上工作,没有互联网接入,空闲磁盘空间非常有限,所以我使用了安装在上面的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。

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

所有Windows nt类操作系统都有一个名为FINDSTR的命令行工具(FINDSTR /?它不支持grep所做的一切,但它可能足以满足您的需求。

DR:撕裂握把

自2009年以来,发生了很多事情。Rust提供了许多CLI实用程序,其中包括ripgrep。它被宣传为递归搜索目录的regex模式,支持Windows, MacOSX和Linux。

它很快。看看与类似工具的性能比较。对工具的设计也有很多解释。信息量很大,也很怪。=)

支持POSIX grep工具支持的广泛特性。看看ack作者的比较。

如果你有Scoop,你可以用Scoop install ripgrep安装它。否则请转到文档的安装部分。

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