Czy istnieje odpowiednik grep wiersza polecenia dla systemu Windows 7? To znaczy, chcę odfiltrować wyniki polecenia:
Zastosowanie Bash:
ls | grep root
Co by to było z wiersza polecenia systemu Windows?
Czy istnieje odpowiednik grep wiersza polecenia dla systemu Windows 7? To znaczy, chcę odfiltrować wyniki polecenia:
Zastosowanie Bash:
ls | grep root
Co by to było z wiersza polecenia systemu Windows?
Odpowiedzi:
Findstr brzmi jak chcesz. Cały czas używam go jako przybliżonego grepa na platformie Windows.
Kolejny przykład z rurami:
C:\> dir /B | findstr /R /C:"[mp]"
findstr
jest to, że wzorzec wyrażenia regularnego może nie zawierać alternatyw.
findstr
domyślnie? Od Windows XP ?
Istnieje kilka możliwości:
grep
polecenia Unix . Istnieje kilka opcji. Często wymieniane są GNUWin32 , cygwin i unxutils . Mniej znane, ale pod pewnymi względami lepsze, są narzędzia z zestawu narzędzi SFUA , które działają w Podsystemie aplikacji dla systemu UNIX, który jest dostępny w zestawie z Windows 7 Ultimate Edition i Windows Server 2008 R2. (W systemie Windows XP można pobrać i zainstalować usługi dla systemu UNIX w wersji 3.5 .) Ten zestaw narzędzi zawiera dużą liczbę narzędzi TUI wiersza polecenia, od mv
i du
poprzez powłoki Korna i C, do perl
iawk
. Występuje zarówno w wersjach x86-64 i IA64, jak i x86-32. Programy działają w natywnym środowisku POSIX systemu Windows, a nie z emulatorowymi bibliotekami DLL (np. cygwin1.dll
) Nakładającymi warstwy na Win32. I tak, zestaw narzędzi grep
, a także około 300 innych.grep
poleceń Win32 , które ludzie napisali i opublikowali. Tim Charron ma na przykład natywną wersję Win32 zmodyfikowanego grepu GNU . Istnieją również PowerGREP , Bare Grep , grepWin , AstroGrep i dnGrep , chociaż są to wszystkie programy GUI, a nie programy TUI.find
i findstr
. grep
Uwaga: składnia jest inna niż w przypadku wyrażeń regularnych.Jeśli dozwolone są polecenia PowerShell , użyj
PS C:\> Get-ChildItem | Select-String root
lub krótki
PS C:\> ls | sls root
Należy pamiętać, że alias sls
jest definiowany dopiero od wersji PowerShell 3.0. Możesz dodać alias, aby mniej pisać:
PS C:\> New-Alias sls Select-String
Aby uruchomić polecenie PowerShell bezpośrednio z cmd, użyj
C:\>powershell -command "ls | select-string root"
W swojej wczesnej wersji napisałeś MS-DOS, jest tylko FIND
tyle, o ile wiem. Ale to starożytny system operacyjny, który nie jest już używany.
W wierszu polecenia systemu Windows NT (np Win2K i wygrać XP i nowszych, tak np win7, win10), można użyć find
a findstr
i jeśli pobrać GnuWin32 następniegrep
Podstawowe różnice polegają na tym, że findstr obsługuje pewne wyrażenia regularne . Grep najlepiej obsługuje wyrażenia regularne.
C:\>dir | find "abc"
C:\>dir | find /i "abc"
find /?
i findstr /?
pokazuje, co robią przełączniki.
Gnuwin32 ma „pakiety”. Jeśli pobierasz GnuWin32, proponuję pakiet coreutils dla szeregu podstawowych przydatnych narzędzi, które znasz, ale grep nie jest w tym pakiecie.
Dodany
Grep GnuWin32, kiedy ostatnio sprawdzałem, jest stary. Grep Cygwina jest znacznie bardziej aktualny. Należy również pamiętać, że wiele osób używa maszyn wirtualnych zamiast portów Windows poleceń * nix.
Jeśli wolisz używać grep
zamiast tego findstr
, .exe
w UnxUtils jest jedna wersja pliku , więc jest przenośna i nie trzeba jej instalować ani używać czegoś takiego jak Cygwin.
.zip
plik .exe
plików. Jedynym minusem jest to, że wersje są nieco stare.
grep
system Windows: gnuwin32.sourceforge.net/packages/grep.htm
Możesz spróbować zainstalować Chocolatey w systemie Windows, a następnie zainstalować narzędzie Gow . Zapewni to grep
w systemie Windows.
Gow
skrót od GNU w systemie Windows. Zapewnia uniksowe narzędzia wiersza poleceń w systemie Windows.
Użyj Bash
$ ls | grep root
Użycie Cmd
> dir /b | findstr root
gdzie /b
oznacza b to lista katalogów i plików
/B
, /R
a /C
OP nie pytał o to, podczas gdy moja odpowiedź daje dokładny odpowiednik
/b
to, aby dir
wynik był taki sam jak ls
wynik. Jeśli go przetestujesz, zobaczysz różnicę. Więc to nie jest dokładny odpowiednik.
Napisałem alternatywę dla systemu Windows dla grep za pomocą kodu Hybrid Batch / JScript. Napisałem to, ponieważ uzyskanie znaków ucieczki bezpośrednio w porcie grep GNU Win32 było prawdziwym bólem. Ta wersja działa o wiele bardziej jak chcesz, aby wersja GNU działała w systemie 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);
}
}
}
W tym celu możesz zawsze znaleźć najnowszą wersję na mojej stronie Gist .
Przygotowano program wielu zamienników, aby można było wykonywać wiele funkcji przy użyciu parametrów wiersza poleceń. Użycie wiersza poleceń jest widoczne poniżej:
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]
Sugerowałbym użycie busybox-w32 , ponieważ ma tylko około 500 KB i jest aktywnie utrzymywany.
W twoim przypadku w wierszu polecenia jest to:
busybox ls | busybox grep root
Możesz użyć doskey
w wierszu polecenia uruchomienia pliku wsadowego, aby wykonać polecenie, takie jak:
doskey ls="path\to\busybox.exe" ls $*
doskey grep="path\to\busybox.exe" grep $*
Następnie możesz użyć ls | grep root
w wierszu polecenia.
Jeśli chcesz dodać najprostszy grep
do środowiska Windows, przejdź do c:\windows\system32
i dodaj mały skrypt wsadowy za pomocą tego polecenia:
echo findstr %1 > grep.bat
Teraz możesz
dir | grep notepad.exe
co jest naprawdę przerażającą mieszanką gówna. Dodaj więc kolejny skrypt wsadowy, ls
jak wyjaśniono w tym poście
echo dir %1 > %systemroot%\system32\ls.bat
Teraz wszystko wygląda trochę znajomo
ls | grep notepad
HTH
echo findstr %1 %2 %3 %4 %5 > %systemroot%\grep.cmd
To będzie szybki i brudny odpowiednik.
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