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


当前回答

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

其他回答

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

DR:撕裂握把

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

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

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

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

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

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

我知道这是一个老问题,但我看到这个帖子寻求答案。我找到了一个,所以把它添加到这里,作为互联网的集体记忆

Powershell:选择string 模块: Microsoft.PowerShell.Utility

https://learn.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/

举个简单的例子: 猫包。选择字符串-模式webpack . json | ls ./src/components/ | Select-String -Pattern View

C:>猫帖。md | Select-String -Pattern "^\w*:"