Чи є у Windows утиліта, що відповідає шаблону, як GREP?


179

Чи є аналогічна утиліта, яка grepдоступна в командному рядку Windows, чи є інструмент стороннього виробника для неї?

Відповіді:


238

Існує інструмент командного рядка, який називається FINDSTRвсіма операційними системами Windows NT-класу (введіть FINDSTR /?у вікно командного рядка для отримання додаткової інформації). Він не підтримує все grep, але може бути достатньо для ваших потреб


7
Дякую! Це не греп, але мені подобається працювати, не встановлюючи додаткового програмного забезпечення на чужих машинах, і це дозволить мені.
шавлія

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

3
@sage, з деякою творчістю, findstr працює точно як 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, файл, sed, groff, indent тощо.

І постійно оновлюється, коли випускаються нові версії цих інструментів.


Зараз, здається, він доступний на хоклаті, тому 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-WindowsOptionsFeature' не розпізнається як внутрішня чи зовнішня команда, функціонуюча програма чи пакетний файл. Спасибі, btw.
Садун


Дякую. Я спробую це. ;)
Сандун


3

Відмінна та дуже швидка утиліта пошуку файлів, агент Ransack , підтримує регулярний пошук виразів. Це насамперед утиліта GUI, але також доступний інтерфейс командного рядка.


2

У вікні reskit є утиліта під назвою "qgrep". Ви можете мати його вже у коробці. ;-) Також йде з командою "хвіст", слава богу!


1

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


1

Я додам мою 0,02 долара до цієї теми. dnGREP - це чудовий інструмент grep з відкритим кодом для Windows, який підтримує скасування, інтеграцію провідника Windows, пошук у PDF-файлах, блискавках, документах та купі інших матеріалів ...


1

Так, є лише одна програма для ПК з Windows, яка має надійний графічний інтерфейс, і це важливо для мене. Я працюю розробником і на кожному комп’ютері, який у мене було, перш за все встановіть програму XFind. Він створений у 1997 році і до цього часу версія 1.0 і до цього часу працює, і це найкраще. Часто мені потрібно шукати рядок у " .cs", " .aspx", " .sct" (файл коду форми Visual FoxPro) або просто " . *" І XFind сканує всі файли і показує мені файли, і ще одна чудова річ що ви можете подивитися, де у файлі є рядок. У XFind також є якийсь редактор. Якщо це двійковий файл, він покаже вам знайдений рядок. Спробуйте і використовуйте його назавжди, якщо ви такий розробник, як я.


1

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

Щасти


1

все-в-одному зайняте поле містить grep / egrep / sed / awk та багато іншого

отримати його від:

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


3
Чому я отримую зворотне рішення, коли запитуючий запитував інструменти сторонніх розробників?
Бернхард



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 ++. Деякий час вони надавали свою версію 5.5 як безкоштовне завантаження після реєстрації.



0

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

Мені довелося робити проект електронного відкриття кілька років тому. Я виявив, що fisdstrбули деякі обмеження, більшість особливо fisdstr врешті-решт не вдасться

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

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


0

Я знаю, що це трохи стара тема, але ось ще одна річ, яку ви можете зробити. Я працюю над VM-розробником без доступу до Інтернету та досить обмеженого вільного місця на диску, тому я скористався встановленою на ньому Java.

Скомпілюйте невелику програму java, яка друкує відповідність регулярного виразу на консоль. Помістіть банку десь у вашій системі, створіть пакет для її виконання та додайте папку до вашої змінної 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: Модуль вибору рядків: Microsoft.PowerShell.Utility

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

а також інформативна публікація в блозі з розширеними прикладами: "Як" помилитися "в PowerShell" https://antjanus.com/blog/web-development-tutorials/how-to-grep-in-powershell/

Простий приклад з цієї публікації в блозі: cat package.json | Select-String -Pattern webpack ls ./src/components/ | Вибрати-Рядок -Перегляд на потоці

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


0

Використовувати Cygwin ...

він має 32 та 64 бітні версії,
і він прекрасно працює від Windows 2000 (*)
до Windows 10 або Server 2019

Я довго користуюся Cygwin ...
і нещодавно намагався замінити Windows-Linux-підсистемами ...

ненадовго ...
Я швидко знову повернувся до Цигвіна ...

набагато більш гнучким, контрольованим і багатим ...
також менш нав'язливим ...

просто додайте \ bin до шляху ...
і ви можете використовувати його будь-яке програмне забезпечення в Windows / Batch / Powershell ...
або в DOS-коробці ... або в Powershell-Box ...

Також ви можете встановити багато чудових пакетів,
які справді працюють ... як nginX або PHP ... Я навіть використовую пакет Cygwin PHP у своєму IIS ...

Як бонус ви можете також використовувати його з баш-шкаралупи ...
(Я думаю, це був початковий намір ;-))

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.