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


241

Чи є еквівалент grep командного рядка для Windows 7? Тобто я хочу відфільтрувати результати команди:

Використання Bash:

ls | grep root

Що було б із командного рядка Windows?


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

Відповіді:


280

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

Ще один приклад з трубами:

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

Так, це, здається, те, що я шукаю. Я розумію, є певні обмеження. Я спробую.
chrisjlee

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

6
@VictorGrazi Вони насправді зробили спочатку, дивіться цю статтю . Спочатку він був названий qgrep - але згодом був перейменований.
Zitrax

3
Велика проблема findstrполягає в тому, що схема регулярного виразів може не містити альтернатив.
Вовк

Питання стосується 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, які люди написали та опублікували. Тим Чаррон, наприклад, має вбудовану версію Win32 модифікованої грейп GNU . Є також PowerGREP , Bare Grep , grepWin , AstroGrep і dnGrep , хоча це все програми GUI, а не програми TUI.
  • Використовуйте додані findта findstr. Синтаксис відрізняється від того grep, примітка, як і можливість регулярного вираження.

cygwin працював для мене чудово на Win 7. Мені потрібна grep, і GnuWin32 grep не працював на мене.
Козуч

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

Ви також пишете, що SFUA в чомусь краща. Якими способами?
барлоп

@Kozuch, якщо ви не заявите, як це не спрацювало, ваш коментар не корисний
барлоп

19

Якщо команди PowerShell дозволені, використовуйте

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

або короткий

PS C:\> ls | sls root

Майте на увазі, що псевдонім slsвизначений лише починаючи з версії 3.0 PowerShell. Ви можете додати псевдонім для меншого набору тексту:

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

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

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

2
Греп, Пауершельський шлях. communary.net/2014/11/10/grep-the-powershell-way
Чарльз Бердж

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 не в тому, що це його власний пакет.

Додано

Греп GnuWin32, востаннє перевіряючи, старий. Позбавлення Cygwin набагато актуальніша. Також майте на увазі, що багато людей використовують віртуальні машини, а не порти Windows команд * nix.


9

Якщо ви скоріше використовуєте grep, а не findstr, є одна .exeверсія файлу в UnxUtils , тому вона є портативною і немає необхідності її встановлювати або використовувати щось на зразок Cygwin.


Це цікаво, але знадобиться встановити цей інструмент.
chrisjlee

3
@Chris: Інсталяції немає. Це просто .zipфайл .exeфайлів. Єдиний невеликий недолік - це те, що версії трохи старі.
парадороїд

6
Який мінус бути старим? Чи може програмне забезпечення бути старим? Всі свіжі байти.
користувач невідомий

3
GnuWin32 також передбачає grepдля Windows: gnuwin32.sourceforge.net/packages/grep.htm
LiuYan 刘

3
@userunknown добре, як приклад, команда unxutils sed є старшою і не підтримує \ d, наприклад, \ d22, щоб вказати цитату. Старіший wget може не завантажувати сторінку, на яку буде надана нова версія, і якщо ви попросите підтримку, вони можуть попросити отримати найновішу, яка може вирішити деякі проблеми. Насправді старий греп, без сумніву, не матиме рівня підтримки регулярного
виразів,

3

Ви можете спробувати встановити Chocolatey у Windows, а через це встановити інструмент Gow . Це забезпечить вас у grepWindows.

Gowстенд для GNU в Windows. Він надає утиліти командного рядка Unix у Windows.


1
Це менеджер пакунків, як apt-get, але для Windows. Свою назву він отримав, оскільки розробник базував його на NuGet, який є менеджером пакунків для візуальної студії, і це звучить як самородок (як у курячому самороді), тому він думав, що він буде "смішним" або "розумним" і дзвонить його програма Chocolatey NuGet. Я чув це на подкасті, який опитував його. Gow також можна завантажити самостійно
barlop

1
Я новачок у Gow, після кількох днів використання я можу засвідчити, що мені це дуже подобається - це краще, ніж всі старі порти утилітів UNIX, якими я користувався раніше.
Радім Черней

@RadimCernej ваш коментар не корисний, якщо ви не зазначите, як ви вважаєте, що це краще.
барлоп

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

2

Використання баша

$ ls | grep root

Використання Cmd

> dir /b | findstr root

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


2
Це дублює іншу відповідь і не додає нового вмісту. Будь ласка, не публікуйте відповіді, якщо у вас насправді є щось нове.
DavidPostill

@DavidPostill: Це швидке рішення для користувачів "TL; DR" (як я)
vladkras

Це не є приводом для додавання відповіді, яка не сприяє новому. У будь-якому випадку прийнята відповідь завжди з’явиться першою, тому вона буде прочитана перед вашою.
DavidPostill

@DavidPostill, не заперечуйте, але прийнята відповідь містить кілька зайвих і незрозумілих ключів /B, /Rі /CОП не запитувала про це, в той час як моя відповідь дає точний еквівалент
vladkras

Потрібно /bзробити dirрезультат таким же, як і lsрезультат. Якщо ви протестуєте його, ви побачите різницю. Тож це не точний еквівалент.
DavidPostill

2

Я написав альтернативу grep для Windows, використовуючи код Hybrid Batch / JScript. Я написав це, тому що виправлення символів втечі прямо у греповому порту 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змінної середовища


unxutils grep не пізніше, як ви можете дістати .. unx grep є, 2.4.2але gnuwin32 має пізніший 2.5.4
барлоп

0

Я б запропонував використовувати zasedbox-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у ваше середовище Windows, перейдіть до c:\windows\system32та додайте невеликий пакетний сценарій за допомогою цієї команди:

echo findstr %1 > grep.bat

Тепер ти можеш

dir | grep notepad.exe

що насправді страшна суміш лайна. Тому додайте ще один пакетний сценарій для, lsяк це пояснено в цій публікації

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

Тепер речі виглядають трохи звично

ls | grep notepad

HTH


-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.