Grep эквивалент для Windows 7?


241

Есть ли в командной строке grep эквивалент для Windows 7? То есть я хочу отфильтровать результаты команды:

Использование Bash:

ls | grep root

Что бы это было из командной строки Windows?


9
не путайте ms-dos с командной строкой. + использование find и findstr и даже grep для windows .. легко найти с помощью быстрого поиска. Есть даже таблицы эквивалентных команд в Linux и Windows. также вы пример bash даже не специфичен для bash .. просто я полагаю, * nix OS.
Барлоп

Ответы:


280

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

Еще один пример с трубами:

C:\> dir /B | findstr /R /C:"[mp]"

Да, это то, что я ищу. Я понимаю, что, вероятно, есть ограничения. Я попробую.
chrisjlee

18
почему они не могли просто назвать это grep!
Виктор Граци

6
@VictorGrazi Сначала они это сделали, см. Эту статью . Первоначально он назывался qgrep, но позже был переименован.
Цитракс

3
Большая проблема в findstrтом, что шаблон регулярных выражений может не содержать альтернатив.
Wolf

Вопрос о Windows 7, но какие еще версии Windows имеют findstrпо умолчанию? С Windows XP ?
Питер Мортенсен

44

Есть несколько возможностей:

  • Используйте порт команды Unix grep. Есть несколько вариантов. Чаще всего упоминаются GNUWin32 , cygwin и unxutils . Менее известными, но в некотором смысле лучше, являются инструменты из служебного инструментария SFUA , которые запускаются в Подсистеме для приложений на основе UNIX, которая поставляется в комплекте с Windows 7 Ultimate Edition и Windows Server 2008 R2. (Для Windows XP, можно загрузить и установить службы для UNIX версии 3.5 .) Этот инструментарий имеет большое количество командной строки TUI инструментов, от mvи duчерез оболочки Korn и C, чтобы perlиawk, Он выпускается в версиях x86-64 и IA64, а также x86-32. Программы работают в собственном POSIX-окружении Windows, а не с DLL-библиотеками эмулятора (такими как cygwin1.dll), наслоенными поверх Win32. И да, инструментарий есть grep, а также около 300 других.
  • Используйте одну из многих собственных grepкоманд Win32, которые люди написали и опубликовали. Тим Чаррон, например, имеет встроенную версию модифицированной GNU grep для Win32 . Существуют также PowerGREP , Bare Grep , grepWin , AstroGrep и dnGrep , хотя это все программы с графическим интерфейсом, а не программы TUI.
  • Используйте прилагаемые findи findstr. grepОбратите внимание, что синтаксис отличается от синтаксиса регулярных выражений.

Cygwin прекрасно работал на Win 7. Мне нужен был grep, а GnuWin32 grep не работал для меня.
Козуч

Вы пишете, что я не вижу perl в SUA C: \ Windows \ SUA> dir perl * / s / b Файл не найден и не работает, например, c shell из SUA Я не вижу его в / bin
barlop

Вы также пишете, что SFUA в некоторых отношениях лучше. В каких случаях?
Бароп

@ Козуч, если только вы не заявите, как это не сработало, тогда ваш комментарий бесполезен
barlop

19

Если команды PowerShell разрешены, используйте

PS C:\> Get-ChildItem | Select-String root

или короткий

PS C:\> ls | sls root

Помните, что псевдоним slsопределяется только начиная с PowerShell версии 3.0. Вы можете добавить псевдоним для меньшего ввода:

PS C:\> New-Alias sls Select-String

Чтобы запустить команду PowerShell непосредственно из cmd, используйте

C:\>powershell -command "ls | select-string root"


17

В своей ранней редакции вы написали MS-DOS, есть только FIND, насколько я знаю. Но это древняя ОС, которая больше не используется.

В командной строке Windows NT (например , Win2K и выиграть XP и более поздних, так , например , win7, win10), вы можете использовать findи findstrесли вы загружаете gnuwin32 тогдаgrep

Основные различия заключаются в том, что findstr поддерживает некоторые регулярные выражения . Grep лучше всего поддерживает регулярные выражения.

C:\>dir | find "abc"
C:\>dir | find /i "abc"

find /?и findstr /?показывает вам, что делают переключатели.

У Gnuwin32 есть «пакеты». Если вы загружаете GnuWin32, я предлагаю пакет coreutils для набора базовых полезных утилит, с которыми вы уже знакомы, но в этом случае grep не является его собственным пакетом.

добавленной

Gp GnuWin32, последний раз, когда я проверял, старый. Grep Cygwin's намного более современный. Также имейте в виду, что многие люди используют виртуальные машины, а не порты Windows команд * nix.


9

Если вы предпочитаете использовать grepвместо UnxUtils версию findstrс одним .exeфайлом , она переносима, и вам не нужно устанавливать ее или использовать что-то вроде Cygwin.


Это интересно, но потребует установки этого инструмента.
chrisjlee

3
@ Крис: нет установки. Это просто .zipфайл .exeфайлов. Единственным небольшим недостатком является то, что версии немного старые.
paradroid

6
Какова обратная сторона старости? Может ли программное обеспечение быть старым? Все свежие байты.
пользователь неизвестен

3
GnuWin32 также предоставляет grepдля Windows: gnuwin32.sourceforge.net/packages/grep.htm
LiuYan 研 研

3
@userunknown хорошо, например, команда unxutils sed старше и не поддерживает \ d например \ d22 для указания кавычки. Старые wget могут не загружать страницы, которые будут доступны более новым, и, если вы попросите поддержки, они могут попросить, чтобы вы получили последнюю версию, поскольку это может решить некоторые проблемы. Действительно старый grep, без сомнения, не будет иметь уровень поддержки регулярных выражений, который есть у текущего
barlop

3

Вы можете попробовать установить Chocolatey в Windows, а затем установить инструмент Gow . Это предоставит вам grepна Windows.

Gowстоять за GNU на Windows. Он предоставляет утилиты командной строки Unix в Windows.


1
Это менеджер пакетов, как apt-get, но для Windows. Он получил свое имя, потому что разработчик основал его на NuGet, который является менеджером пакетов для Visual Studio, и это звучит как самородок (как в курином наггетсе), поэтому он подумал, что он будет «забавным» или «умным» и вызовет его программа Chocolatey NuGet. Я слышал это на подкасте, который брал у него интервью. Гоу можно скачать самостоятельно тоже
barlop

1
Я новичок в Gow, после нескольких дней использования я могу засвидетельствовать, что он мне очень нравится - он лучше, чем все старые порты утилит UNIX, которые я использовал ранее.
Радим Черней

@RadimCernej ваш комментарий бесполезен, если вы не заявите, как вы думаете, что он лучше.
Барлоп

@barlop: С тех пор как я написал свой комментарий на январь 2016 года, я постепенно и полностью переключился на Gow. Пока нет ошибок, в нем есть все утилиты, которые мне нужны / используются, путь выводится в формате Microsoft (что позволяет легко копировать / вставлять в другие программы). Gow неинвазивен (прост в установке и удалении), поэтому я настоятельно рекомендую вам протестировать его.
Радим Черней

2

Использование Bash

$ ls | grep root

Cmd использовать

> dir /b | findstr root

где b/b обозначает список каталогов и файлов


2
Это дублирует другой ответ и не добавляет новый контент. Пожалуйста, не публикуйте ответ, если у вас нет чего-то нового.
DavidPostill

@DavidPostill: Это быстрое решение для пользователей "TL; DR" (таких как я)
vladkras

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

@DavidPostill, не возражайте, но принятый ответ содержит несколько чрезмерных и необъяснимых ключей /B, /Rи /COP не спрашивал о чем, в то время как мой ответ дает точный эквивалент
vladkras

/b, Чтобы сделать dirвывод такой же , как на lsвыходе. Если вы проверите это, вы увидите разницу. Так что это не точный эквивалент.
ДэвидПостилл

2

Я написал альтернативу grep для Windows с использованием кода Hybrid Batch / JScript. Я написал это потому, что получить экранирующие символы прямо в grep-порте GNU Win32 было очень трудно. Эта версия работает так же, как если бы вы хотели, чтобы версия GNU работала в Windows:

@set @junk=1 /*
@cscript //nologo //E:jscript %~f0 %*
@goto :eof */

var args=WScript.Arguments, argCnt=args.Length, stdin=WScript.StdIn, stdout=WScript.StdOut;
var replaceSingleQuotes=false, printMatchesOnly=false, matchString, flagString, regex, argDx=0;

if(argCnt==0) {
    throw new Error("You must provide search criteria.");
}

flagString=""
if(argCnt>1) {
    for(var bLoop=true; bLoop&&argDx<argCnt-1; argDx++) {
        switch(args(argDx)) {
        case '-t': replaceSingleQuotes=true; break;
        case '-o': printMatchesOnly=true; break;
        case '-g': flagString+="g"; break;
        case '-i': flagString+="i"; break;
        case '-m': flagString+="m"; break;
        default: bLoop=false; break;
        }
    }
}
if(replaceSingleQuotes) {
    matchString=args(argCnt-1).replace("'", '"');
} else {
    matchString=args(argCnt-1);
}

if(printMatchesOnly) {
    while(!stdin.AtEndOfStream) {
        var sLine=stdin.ReadLine();
        if(flagString.Length) regex=new RegExp(matchString, flagString);
        else regex=new RegExp(matchString);
        var m,matches=[],startDx=0;
        while((m=regex.exec(sLine.substr(startDx))) !== null) {
            stdout.WriteLine(m[0]);
            startDx+=m.lastIndex;
        }
    }
} else {
    if(flagString.Length) regex=new RegExp(matchString, flagString);
    else regex=new RegExp(matchString);
    while(!stdin.AtEndOfStream) {
        var sLine=stdin.ReadLine();
        if(regex.test(sLine)) {
            stdout.WriteLine(sLine);
        }
    }

}

Вы всегда можете найти последнюю версию на моей странице Gist для этого.


1

http://www.multireplacer.com

Программа с несколькими заменителями была подготовлена ​​так, что многие функции могут быть выполнены с использованием параметров командной строки. Использование командной строки видно ниже:

MultiReplacer [Multi Replacer File] | [Search files] | [Search folders]
[-Subs] [-NoSubs] [-IncPtr=pattern] [-ExcPtr=patterns] [-DestDir=destination]
[-DMAnyTime]
[-DMWithinanhour] [-DMToday] [-DMYesterday] [-DMThisweek] [-DMThismonth]
[-DMThisYear]
[-CDMAfter=date] [-CDMBefore=date] [-MinFileSize=bytes count]
[-MaxFileSize=bytes count]
[-Search=text] [-Case] [-NoCase] [-Regex] [-NoRegex] [-SubMatchText=text]
[-ReplaceText=text]
[-StartSearch] [-StartReplace] [-AutoClose] [-StopAfterMatchThisFile] [-StopAfterMatchAll]
[-ExtractedWordsFile=filename] [-ExtractedLinesFile=filename] [-
ReportFile=filename]

0

Вы все еще можете использовать свои знакомые grepи другие команды Linux, загрузив этот инструмент UnxUtils и добавив его местоположение в PATHпеременную среды


grex unxutils не так поздно, как вы можете получить .. grep unx есть, 2.4.2но gnuwin32 имеет более позднюю 2.5.4
barlop

0

Я бы предложил использовать busybox-w32 , так как он имеет размер всего около 500 КБ и активно поддерживается.

Так что в вашем случае в командной строке это:

busybox ls | busybox grep root

Вы можете использовать doskeyв командной строке запуск командным файлом для создания команды, например:

doskey ls="path\to\busybox.exe" ls $*

doskey grep="path\to\busybox.exe" grep $*

Затем вы можете использовать ls | grep rootв командной строке.


у него тоже сборка андроида
barlop

0

Если вы хотите добавить простейшую grepсреду Windows, перейдите c:\windows\system32и добавьте небольшой пакетный скрипт с помощью этой команды:

echo findstr %1 > grep.bat

Теперь вы можете

dir | grep notepad.exe

что действительно страшная смесь дерьма. Поэтому добавьте еще один пакетный скрипт, lsкак описано в этом посте.

echo dir %1 > %systemroot%\system32\ls.bat

Теперь все выглядит немного знакомо

ls | grep notepad

НТН


-2
echo findstr %1 %2 %3 %4 %5 > %systemroot%\grep.cmd

Это будет быстрый и грязный эквивалент.

C:\Windows\system32>dir | grep xwiz
C:\Windows\system32>findstr xwiz
2009.06.10  23:03             4.041 xwizard.dtd
2009.07.14  03:39            42.496 xwizard.exe
2009.07.14  03:41           432.640 xwizards.dll

Кстати, у этого скучного ответа 44 отзыва на знаменитом российском блоге разработчиков habrahabr.ru/post/71568
vladkras
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.