226

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

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

ls | grep root

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

13 ответов13

266

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

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

C:\> dir /B | findstr /R /C:"[mp]"
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 других.
  • Используйте одну из многих встроенных команд Win32 grep которые люди написали и опубликовали. Тим Чаррон, например, имеет встроенную версию модифицированного GNU grep для Win32 . Существуют также PowerGREP, Bare Grep, grepWin, AstroGrep и dnGrep, хотя это все программы с графическим интерфейсом, а не программы TUI.
  • Используйте прилагаемые find и findstr . Синтаксис отличается от синтаксиса grep , note, как и возможность регулярных выражений.
18

Если команды 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"
15

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

В командной строке Windows NT (например, Win2K и Win 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 а не findstr есть один .exe - файл версия в UnxUtils, так что это портативный и нет необходимости устанавливать его, или использовать что - то вроде Cygwin.

3

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

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

2

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

$ ls | grep root

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

> dir /b | findstr root

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

2

Я написал альтернативу grep для Windows с использованием кода Hybrid Batch/JScript. Я написал это потому, что получить экранирующие символы прямо в GNU Win32 grep-порту было настоящей болью. Эта версия работает так же, как если бы вы хотели, чтобы версия 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 в среду Windows, перейдите в c:\windows\system32 и добавьте небольшой пакетный скрипт с помощью этой команды:

echo findstr %1 > grep.bat

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

dir | grep notepad.exe

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

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

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

ls | grep notepad

НТН

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 в командной строке.

0

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

-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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .