Có một dấu nhắc lệnh grep tương đương với Windows 7 không? Đó là, tôi muốn lọc ra kết quả của một lệnh:
Bash sử dụng:
ls | grep root
Nó sẽ là gì từ một dấu nhắc lệnh của Windows?
Có một dấu nhắc lệnh grep tương đương với Windows 7 không? Đó là, tôi muốn lọc ra kết quả của một lệnh:
Bash sử dụng:
ls | grep root
Nó sẽ là gì từ một dấu nhắc lệnh của Windows?
Câu trả lời:
Findstr âm thanh như những gì bạn muốn. Tôi sử dụng nó mọi lúc như một grep tương đương trên nền tảng Windows.
Một ví dụ khác với đường ống:
C:\> dir /B | findstr /R /C:"[mp]"
findstr
là mẫu regex có thể không chứa các lựa chọn thay thế.
findstr
mặc định là gì? Kể từ Windows XP ?
Có một số khả năng:
grep
lệnh Unix . Có một số lựa chọn. Thường được đề cập là GNUWin32 , cygwin và unxutils . Ít được biết đến, nhưng theo một số cách tốt hơn, là các công cụ trong bộ công cụ tiện ích SFUA , chạy trong Hệ thống con cho các Ứng dụng dựa trên UNIX có ngay trong hộp với phiên bản Windows 7 Ultimate và Windows Server 2008 R2. (Đối với Windows XP, người ta có thể tải xuống và cài đặt Dịch vụ cho UNIX phiên bản 3.5 .) Bộ công cụ này có một số lượng lớn các công cụ TUI dòng lệnh, từ mv
và du
, thông qua các vỏ Korn và C, đến perl
vàawk
. Nó có cả hai hương vị x86-64 và IA64 cũng như x86-32. Các chương trình chạy trong môi trường POSIX thích hợp riêng của Windows, thay vì với các trình giả lập DLL (chẳng hạn như cygwin1.dll
) xếp lớp các thứ trên Win32. Và vâng, bộ công cụ có grep
, cũng như khoảng 300 người khác.grep
lệnh Win32 gốc mà mọi người đã viết và xuất bản. Ví dụ, Tim Charron có phiên bản Win32 gốc của một grep GNU đã sửa đổi . Ngoài ra còn có PowerGREP , Bare Grep , grepWin , AstroGrep và dnGrep , mặc dù đây đều là các chương trình GUI không phải là chương trình TUI.find
và findstr
. Cú pháp khác với cú pháp grep
, lưu ý, như là khả năng biểu thức chính quy.Nếu các lệnh PowerShell được cho phép, hãy sử dụng
PS C:\> Get-ChildItem | Select-String root
hoặc ngắn
PS C:\> ls | sls root
Xin lưu ý rằng bí danh sls
chỉ được xác định bắt đầu bằng PowerShell phiên bản 3.0. Bạn có thể thêm một bí danh để gõ ít hơn:
PS C:\> New-Alias sls Select-String
Để chạy lệnh PowerShell trực tiếp từ cmd, hãy sử dụng
C:\>powershell -command "ls | select-string root"
Trong phiên bản đầu tiên của bạn, bạn đã viết MS-DOS, chỉ có FIND
, theo như tôi biết. Nhưng đó là một hệ điều hành cổ xưa không được sử dụng nữa.
Trong cửa sổ lệnh Windows NT (ví dụ Win2K và win XP và sau đó, vì vậy ví dụ như win7, win10), bạn có thể sử dụng find
và findstr
và nếu bạn tải GnuWin32 sau đógrep
Sự khác biệt cơ bản là findstr có một số biểu thức hỗ trợ thông thường . Grep hỗ trợ các biểu thức chính quy tốt nhất.
C:\>dir | find "abc"
C:\>dir | find /i "abc"
find /?
và findstr /?
cho bạn thấy những gì các công tắc làm.
Gnuwin32 có "gói". Nếu bạn tải xuống GnuWin32, tôi đề xuất gói coreutils cho một loạt các tiện ích hữu ích cơ bản mà bạn quen thuộc, nhưng grep không có trong đó là gói riêng của nó.
Thêm
GrepWin32's grep, lần trước tôi đã kiểm tra, đã cũ. Grep của Cygwin được cập nhật hơn nhiều. Cũng nên nhớ rằng nhiều người sử dụng Máy ảo thay vì các cổng của lệnh * nix.
Nếu bạn muốn sử dụng grep
, thay vì findstr
, có một .exe
phiên bản tệp duy nhất trong UnxUtils , vì vậy nó có thể mang theo và không cần phải cài đặt nó, hoặc sử dụng một cái gì đó như Cygwin.
.zip
tập .exe
tin. Nhược điểm nhỏ duy nhất là các phiên bản hơi cũ.
grep
cho Windows: gnuwin32.sourceforge.net/packages/grep.htm
Bạn có thể thử cài đặt Chocolatey trên Windows và thông qua đó, cài đặt công cụ Gow . Điều này sẽ cung cấp cho bạn grep
trên Windows.
Gow
viết tắt của GNU trên Windows. Nó cung cấp các tiện ích dòng lệnh Unix trên Windows.
Bash sử dụng
$ ls | grep root
Cmd sử dụng
> dir /b | findstr root
trong đó /b
viết tắt của b là danh sách các thư mục và tập tin
/B
, /R
và /C
OP đã không hỏi về, trong khi câu trả lời của tôi cho chính xác tương đương
/b
để làm cho dir
đầu ra giống như ls
đầu ra. Nếu bạn kiểm tra nó bạn sẽ thấy sự khác biệt. Vì vậy, nó không phải là tương đương chính xác.
Tôi đã viết một thay thế Windows cho grep bằng mã Hybrid Batch / JScript. Tôi đã viết điều này bởi vì nhận được các ký tự thoát ngay trong cổng grep GNU Win32 là một nỗi đau thực sự. Phiên bản này hoạt động giống như cách bạn muốn phiên bản GNU hoạt động trong 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);
}
}
}
Bạn luôn có thể tìm thấy phiên bản mới nhất trên trang Gist của tôi cho việc này.
Chương trình đa thay thế đã được chuẩn bị để có thể thực hiện nhiều chức năng bằng cách sử dụng các tham số dòng lệnh. Sử dụng dòng lệnh được nhìn thấy dưới đây:
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]
Tôi sẽ đề nghị sử dụng busybox-w32 , vì nó chỉ có kích thước khoảng 500 KB và được duy trì tích cực.
Vì vậy, trong trường hợp của bạn, trong dấu nhắc lệnh, đó là:
busybox ls | busybox grep root
Bạn có thể sử dụng doskey
trong một dấu nhắc lệnh khởi chạy bởi một tệp bó để tạo một lệnh, như:
doskey ls="path\to\busybox.exe" ls $*
doskey grep="path\to\busybox.exe" grep $*
Sau đó, bạn có thể sử dụng ls | grep root
trên dấu nhắc lệnh.
Nếu bạn muốn thêm đơn giản nhất grep
vào môi trường windows của mình, thì hãy điều hướng đến c:\windows\system32
và thêm một tập lệnh bó nhỏ bằng cách sử dụng lệnh này:
echo findstr %1 > grep.bat
Bây giờ bạn có thể
dir | grep notepad.exe
đó thực sự là một hỗn hợp đáng sợ của shit. Vì vậy, thêm một tập lệnh bó khác ls
như được giải thích trong bài viết này
echo dir %1 > %systemroot%\system32\ls.bat
Bây giờ mọi thứ trông hơi quen
ls | grep notepad
HTH
echo findstr %1 %2 %3 %4 %5 > %systemroot%\grep.cmd
Điều đó sẽ nhanh chóng và bẩn tương đương.
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