Существует ли в Windows утилита сопоставления с образцом, такая как GREP?


179

Существует ли аналогичная утилита, grepдоступная в командной строке Windows, или для нее есть сторонний инструмент?

Ответы:


238

Существует инструмент командной строки, FINDSTRкоторый поставляется со всеми операционными системами класса Windows NT ( FINDSTR /?для получения дополнительной информации введите его в окне командной строки). Он не поддерживает все grep, но может быть достаточным для ваших нужд.


7
Спасибо! Это не grep, но мне нравится работать без установки дополнительного программного обеспечения на чужие машины, и это позволит мне.
мудрец

42
Вы также можете использовать его с символом трубы, например,netstat -n | FINDSTR 3389
harperville

3
@sage, с некоторым творческим подходом, findstr работает точно так же, как grep. Обратитесь к этому примеру grep для Windows .
mkyong

2
@mkyong - я согласен. Я не хотел сказать, что это как-то неполно, просто что-то другое, и использование большего количества инструментов требует больше работы. При этом, когда я использую компьютеры других людей, findstr - мой любимый инструмент, но мне приходится обновлять память по синтаксису каждый раз, когда я его использую.
мудрец

1
@gonzobrains: Это не так хорошо задокументировано. Насколько я могу судить, он всегда был доступен из командной строки Windows NT - конечно, он был доступен в Windows NT 4, но я не знаю о Windows 3.5x. В то время Microsoft считала командную строку таким «гражданином второго сорта», что многие полезные утилиты командной строки были упущены из документации Ken
Кен Кинэн,

35

PowerShell (входит в стандартную комплектацию Windows 7 / 2008R2, дополнительно для XP / 2003 / Vista / 2008), которая включает select-stringкомандлет для этой цели.


10
Хотя Select-String (псевдоним: sls) использует регулярные выражения, он не поддерживает некоторые базовые функции, такие как рекурсия каталога. Для этого вам нужно объединить несколько команд PowerShell. Например, "dir -R -Include * .txt | sls" ^ My Regex String $ "
yzorg



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

Я использую Cygwin в течение долгого времени ... и недавно пытаюсь заменить Windows-Linux-подсистемами ... ненадолго ... НАЗАД К CYGWIN ... гораздо более богатым и менее навязчивым ... просто добавьте <cygwin > \ bin к пути ... и вы можете использовать его любым способом в Windows / Batch / Powershell ... в s-DOS-Box ... в Powershell-Box ... и т. д. и т. д. - БОЛЬШОЙ ИНСТРУМЕНТ! !!
ZEE

11

Я также нашел еще один способ использования функциональности, аналогичной GREP, в Windows 7 и более поздних версиях без установки дополнительного приложения, а на старых системах вы можете использовать установку Powershell.

В Powershell Пользователь может использовать Where-Object, который имеет достаточно полный набор функций, который предоставляет все функциональные возможности GREP и многое другое.

Надеюсь, поможет.


10

Я удивлен, что никто не упомянул FINDSTR . Я не grep poweruser, но findstr делает то, что мне нужно, фильтрует файлы и stdin с некоторой примитивной поддержкой регулярных выражений. Корабли с Windows и все такое. (Изменить: Ну, кто-то упомянул findstr, я думаю, уже поздно)


5
«никто не упомянул FINDSTR» - «лучший» ответ на год старше, и он упоминает FINDSTR ...
chiccodoro

6

Стоит отметить, что GnuWin32 предоставляет стандартную версию Win32 для всех стандартных инструментов linux, включая grep, file, sed, groff, indent и т. Д.

И он постоянно обновляется, когда выпускаются новые версии этих инструментов.


Теперь он доступен для choclatey, поэтому cinst GnuWin32 работает для его быстрой установки.
Стюарт Аксон

4

В Windows я использую Far Manager для поиска файлов. BSD лицензирован, работает в консоли, экономит время при наборе параметров cmdline. Вот его диалог поиска, вызванный Alt-F7.Alt-F7


4

Обновление: это не было правдой, когда вопрос был задан изначально, но теперь Microsoft позволяет установить Подсистему Windows для Linux , и тогда Windows запустит grep. В PowerShell запустите:

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

Я пробовал, но выдает эту ошибку: «Enable-WindowsOptionalFeature» не распознается как внутренняя или внешняя команда, работающая программа или командный файл. Спасибо, кстати.
Сандун


Спасибо. Я попробую это. ;)
Сандун

3

UnxUtils - это отличный набор утилит Unix, которые работают в Windows. Он имеет grep, sed, gawk и т. Д.


3
UnxUtils не поддерживается в течение многих лет. Вместо этого используйте GnuWin32 или Cygwin.
JPaget

gnu on windows (gow) более полная, чем GnuWin32: github.com/bmatzelle/gow/wiki
Simon D

3

Отличная и очень быстрая утилита поиска файлов, Agent Ransack , поддерживает поиск по регулярным выражениям. В первую очередь это утилита с графическим интерфейсом, но также доступен интерфейс командной строки.


2

В Windows Reskit есть утилита под названием "qgrep". Возможно, он уже у вас на коробке. ;-) Это также идет с командой "tail", слава богу!


1

Хотя технически это не grep и не командная строка, Microsoft Visual Studio и Notepad ++ имеют очень хорошую функцию поиска в файлах с полной поддержкой регулярных выражений. Я часто использую их, хотя у меня также есть версия grep для CygWin, доступная в командной строке.


1

Я добавлю свои $ 0,02 к этой теме. dnGREP - это отличный инструмент grep с открытым исходным кодом для Windows, который поддерживает отмену, интеграцию с проводником Windows, поиск по PDF, zip, DOC и многому другому


1

Да, есть только одна программа для ПК с Windows, которая имеет солидный графический интерфейс, и это очень важно для меня. Я работаю разработчиком и на каждом компьютере, который у меня был, сначала устанавливаю программу XFind. Он создан в 1997 году и до сих пор является версией 1.0 и до сих пор работает и является лучшим. Часто мне нужно искать некоторую строку в « .cs», « .aspx», « .sct» (файл кода формы Visual FoxPro) или просто « . *», И XFind сканирует все файлы и показывает мне файлы, и еще одна замечательная вещь что вы можете посмотреть, где находится строка в файле. XFind также имеет своего рода редактор. Если это бинарный файл, он покажет вам поиск строки. Попробуйте и используйте это навсегда, если вы разработчик, как я.


1

Вы, очевидно, получили много разных рекомендаций.
Мой личный выбор бесплатной сторонней утилиты: Agent Ransack
Загрузка агента Ransack
Несмотря на несколько запутанное название, он хорошо работает и может использоваться для поиска файлов различными способами.

Удачи


1

многофункциональный модуль busybox содержит grep / egrep / sed / awk и многое другое

получить его от:

Обновление: больше не доступно - или более старое


3
почему я получаю отрицательные отзывы, когда спрашивающий спрашивает сторонние инструменты?
Бернхард



0

Мы недавно использовали PowerGREP для некоторых довольно сложных массовых операций с тысячами файлов. Включая поиск по регулярному выражению в содержимом файлов PDF и изменяя документы PDF в крупном масштабе.

Это стоит денег, если вы хотите сэкономить время на труде. Вы можете попробовать это, прежде чем купить, я думаю.


0

Если вам нужно использовать «голую» Windows, то в дополнение к указанному выше параметру Powershell вы можете использовать VBScript, который имеет достойную поддержку RegEx.

MS также имеет приличную область сценариев в Technet с множеством примеров для администраторов.


0

Просто попробуйте Java-утилиту LikeGrep. Это может помочь вам во многих случаях. По вашему желанию он также может заменить некоторый текст, найденный в файлах. Он гарантирует работу с большими файлами (проверено до 8 Гб)


0

Как упоминалось выше, проект gnuwin32 имеет версию grep для Windows CLI.

Если вы хотите что-то с графическим интерфейсом, я бы порекомендовал ( AstroGrep ) инструмент с открытым исходным кодом .


0

Прошло много времени с тех пор, как я их использовал, но Borland (сейчас Embarcadero) включил grep командной строки в свой компилятор C / C ++. В течение некоторого времени они сделали доступной свою версию 5.5 для бесплатной загрузки после регистрации.



0

Я рекомендую PowerGrep

Я должен был сделать проект электронного открытия несколько лет назад. Я обнаружил, что fisdstrесть некоторые ограничения, особенно FISDSTR в конечном итоге потерпит неудачу

сценарий должен был искать тысячи файлов, используя пару десятков поисковых терминов / фраз.

Grep Cygwin работал намного лучше , он не давился часто, но в конечном итоге я пошел в PowerGrep, потому что графический интерфейс позволил намного легче определить, когда и где произошел сбой, а также было действительно легко редактировать все условные выражения и выводить, что Я хотел. В конечном итоге PowerGrep был самым надежным из трех.


0

Я знаю, что это немного старая тема, но вот еще одна вещь, которую вы можете сделать. Я работаю на виртуальной машине разработчика без доступа к Интернету и довольно ограниченного свободного дискового пространства, поэтому я использовал установленную на ней 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 %*

и добавьте c: \ jgrep в конец переменной среды PATH.

Сейчас просто позвони jgrep "expression" file.txt из любой точки мира.

Мне нужно было напечатать некоторые конкретные группы из моего выражения, поэтому я добавил модификатор и назвал его как jgrep -printGroup=1 "expression" file.txt.


0

Я понимаю, это старый вопрос, но я наткнулся на этот пост в поисках ответа. И я нашел один, так что добавив его здесь для коллективной памяти в Интернете

Powershell: модуль Select-String: Microsoft.PowerShell.Utility

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

и информативное сообщение в блоге с расширенными примерами: «Как выполнить« grep »в PowerShell» https://antjanus.com/blog/web-development-tutorials/how-to-grep-in-powershell/

Простой пример из этого поста в блоге: cat package.json | Select-String -Pattern webpack ls ./src/components/ | Select-String -Pattern View

C:> кошка post.md | Select-String -Pattern "^ \ w *:"


0

Используйте Cygwin ...

он имеет 32- и 64-битные версии
и отлично работает с Windows 2000 (*)
до Windows 10 или Server 2019

Я давно пользуюсь Cygwin ...
и недавно пытался заменить Windows-Linux-подсистемами ...

ненадолго ...
я быстро вернулся к Cygwin снова ...

гораздо более гибкий, управляемый и богатый ...
и менее навязчивый ...

просто добавьте \ bin к пути ...
и вы можете использовать его в любом случае в Windows / Batch / Powershell ...
или в DOS-Box ... или в Powershell-Box ...

Также вы можете установить массу отличных пакетов
которые действительно работают ... как nginX или PHP ... Я даже использую пакет Cygwin PHP в своем IIS ...

В качестве бонуса вы также можете использовать его из оболочки Bash ...
(Я думаю, что это было первоначальное намерение ;-))

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.