Grep эквивалент для Windows 7?
Есть ли командная строка grep эквивалент для Windows 7? То есть я хочу отфильтровать результаты команды:
Bash use:
ls | grep root
Что бы это было из командной строки Windows?
(http://technet.microsoft.com/en-us/library/bb490907.aspx) звучит так, как ты хочешь. Я постоянно использую его как примерный grep-эквивалент на платформе Windows. Еще один пример с трубами:
C:\> dir /B | findstr /R /C:"[mp]"
Есть несколько возможностей:
grep
команды. Есть несколько вариантов. Часто упоминаются GNUWin32 , cygwin и unxutils . Менее известные, но в некотором роде лучше, инструменты из SFUA utility toolkit , которые запускаются в Subsystem for UNIX-based Applications , которые идут прямо сюда в комплекте с 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. Программы работают в родном для Windows POSIX окружении, а не с эмуляторными DLL (такими как cygwin1.dll
), расслаивающими вещи по Win32. И да, инструментарий имеет grep
, а также около 300 других. grep
, которые люди написали и опубликовали. У Тима Чаррона, например, есть нативная Win32 версия модифицированного GNU grep . Есть также команды PowerGREP , Bare Grep , grepWin , AstroGrep и dnGrep , хотя это все программы с графическим интерфейсом, а не программы с интерфейсом TUI. find
и findstr
. Синтаксис отличается от синтаксиса команды grep
, обратите внимание, так же как и возможность регулярных выражений.Если разрешены команды 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"
```.
В вашей ранней ревизии вы написали MS-DOS, есть только FIND
, насколько я знаю. Но это старая ОС, которая больше не используется.
В командной строке Windows NT (например, Win2K и win XP и позже, так что, например, win7,win10), вы можете использовать find
и findstr
, и если вы загрузите GnuWin32 , то grep
Основные различия заключаются в том, что findstr имеет поддержку некоторых регулярных выражений . Лучше всего поддерживает регулярные выражения.
C:\>dir | find "abc"
C:\>dir | find /i "abc"
find /?
и findstr /?
показывает, что делают переключатели.
Gnuwin32 имеет “пакеты”. Если вы загружаете GnuWin32, я предлагаю пакет coreutils для кучи основных полезных утилит, с которыми вы были бы знакомы, но grep не в том, что это его собственный пакет.
Добавленный
GnuWin32’s grep, последний раз, когда я проверял, является старым. Греп Сигвина гораздо более современный. Также имейте в виду, что многие люди используют виртуальные машины, а не windows-порты команд *nix.
Вы можете попробовать установить Chocolatey на Windows, и через это установить инструмент Gow . Это даст вам grep
под Windows.
Gow
подставку для GNU под Windows. Она предоставляет утилиты командной строки Unix под Windows.
Я написал Windows альтернативу grep, используя Hybrid Batch/JScript код. Я написал это, потому что получение escape-символов прямо в 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 .
Подготовлена программа Multi Repacer, так что многие функции могут быть выполнены с помощью параметров командной строки. Использование командной строки показано ниже:
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]
Я бы предложил использовать busybox-w32 , т.к. он всего около 500 KB по размеру и активно поддерживается.
Так что в вашем случае, в командной строке, это:
busybox ls | busybox grep root
Вы можете использовать doskey
в запуске командной строки пакетным файлом, чтобы сделать команду, например:
doskey ls="path\to\busybox.exe" ls $*
doskey grep="path\to\busybox.exe" grep $*
Тогда вы можете использовать ls | grep root
в командной строке.
Если вы хотите добавить самую простую grep
в вашу оконную среду, то перейдите к c:\windows\system32
и добавьте небольшой пакетный скрипт, используя эту команду:
echo findstr %1 > grep.bat
Теперь вы можете
dir | grep notepad.exe
, что на самом деле является страшной смесью дерьма. Так что добавьте еще один пакетный скрипт для ls
, как объяснено в этом post
echo dir %1 > %systemroot%\system32\ls.bat
Теперь все выглядит немного знакомо
ls | grep notepad
HTH
Вы все еще можете использовать привычные команды grep
и другие команды Linux, загрузив этот инструмент UnxUtils и добавив его местоположение в переменную окружения PATH
.
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