Grep tương đương với Windows 7?


241

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?


9
đừng nhầm lẫn ms-dos với dấu nhắc lệnh. + sử dụng find và findstr và thậm chí grep, cho windows .. chắc chắn dễ dàng tìm thấy với một tìm kiếm nhanh. thậm chí có bảng các lệnh tương đương trong linux và windows. Ngoài ra, ví dụ bash của bạn thậm chí không cụ thể đối với bash .. chỉ là tôi cho rằng, * nix OS.
barlop

Câu trả lời:


280

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]"

Vâng, đó dường như là những gì tôi đang tìm kiếm. Tôi hiểu có lẽ có những hạn chế. Tôi sẽ thử.
chrisjlee

18
Tại sao họ không thể gọi nó là grep!
Victor Grazi

6
@VictorGrazi Lúc đầu họ thực sự đã làm, xem bài viết này . Ban đầu nó được đặt tên là qgrep - nhưng sau đó được đổi tên.
Zitrax

3
Vấn đề lớn findstrlà mẫu regex có thể không chứa các lựa chọn thay thế.
Sói

Câu hỏi là về Windows 7, nhưng các phiên bản Windows khác có findstrmặc định là gì? Kể từ Windows XP ?
Peter Mortensen

44

Có một số khả năng:

  • Sử dụng một cổng của greplệnh Unix . Có một số lựa chọn. Thường được đề cập là GNUWin32 , cygwinunxutils . Í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ừ mvdu, thông qua các vỏ Korn và C, đến perlawk. 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.
  • Sử dụng một trong nhiều greplệ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 , AstroGrepdnGrep , mặc dù đây đều là các chương trình GUI không phải là chương trình TUI.
  • Sử dụng được cung cấp findfindstr. 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.

Cygwin đã làm việc tốt cho tôi trên Win 7. Tôi cần grep và GnuWin32 grep không hoạt động với tôi.
Kozuch

Bạn viết Tôi không thấy perl trong SUA C: \ Windows \ SUA> dir perl * / s / b Tệp Không tìm thấy và đang chạy, ví dụ c shell của SUA Tôi không thấy nó trong / bin
barlop

bạn cũng viết rằng SFUA theo một số cách tốt hơn. Trong những cách?
barlop

@Kozuch trừ khi bạn nêu cách nó không hoạt động, thì bình luận của bạn không hữu ích
barlop

19

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 slschỉ đượ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"


17

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 findfindstrvà 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 /?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.


9

Nếu bạn muốn sử dụng grep, thay vì findstr, có một .exephiê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.


Điều này rất thú vị nhưng sẽ yêu cầu cài đặt công cụ đó.
chrisjlee

3
@Chris: Không có cài đặt. Nó chỉ là một .ziptập .exetin. Nhược điểm nhỏ duy nhất là các phiên bản hơi cũ.
paradroid

6
Nhược điểm của việc cũ là gì? Phần mềm có thể cũ không? Tất cả các byte tươi.
người dùng không xác định

3
GnuWin32 cũng cung cấp grepcho Windows: gnuwin32.sourceforge.net/packages/grep.htm
LiuYan 刘

3
@userunknown, ví dụ, lệnh unxutils sed cũ hơn và không hỗ trợ \ d ví dụ \ d22 để chỉ định trích dẫn. Một wget cũ hơn có thể không tải xuống một trang mà một trang mới hơn sẽ có, và nếu bạn yêu cầu hỗ trợ, họ có thể yêu cầu bạn lấy trang mới nhất vì điều đó có thể giải quyết một số vấn đề. Một grep thực sự cũ chắc chắn sẽ không có mức hỗ trợ regex mà một người hiện tại có
barlop

3

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 greptrên Windows.

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


1
Đó là một trình quản lý gói, giống như apt-get nhưng dành cho windows. Nó có tên là 'nhà phát triển dựa trên NuGet, một người quản lý gói cho studio hình ảnh, và âm thanh đó giống như nugget (như trong gà nugget), vì vậy anh ấy nghĩ rằng mình "vui tính" hoặc "thông minh" và gọi chương trình của mình Chocolatey NuGet. Tôi nghe nói rằng trên một podcast đã phỏng vấn anh ấy. Gow cũng có thể được tải xuống một cách độc lập
barlop 29/07/2015

1
Tôi mới sử dụng Gow, sau vài ngày sử dụng, tôi có thể làm chứng rằng tôi thích nó rất nhiều - nó tốt hơn tất cả các cổng cũ của các tiện ích UNIX mà tôi đã sử dụng trước đây.
Radim Cernej

@RadimCernej bình luận của bạn không hữu ích trừ khi bạn nêu cách bạn nghĩ nó tốt hơn.
barlop

@barlop: Kể từ khi tôi viết bình luận tháng 1-2016, tôi dần dần và hoàn toàn chuyển sang Gow. Cho đến nay không có lỗi, nó có tất cả các tiện ích mà tôi cần / sử dụng, đường dẫn được xuất ra ở định dạng Microsoft (giúp dễ dàng sao chép / dán vào các chương trình khác). Gow không đủ xâm lấn (dễ cài đặt và gỡ bỏ) mà tôi khuyên bạn nên lái thử nó.
Radim Cernej 18/07/2016

2

Bash sử dụng

$ ls | grep root

Cmd sử dụng

> dir /b | findstr root

trong đó /bviết tắt của b là danh sách các thư mục và tập tin


2
Điều này trùng lặp một câu trả lời khác và không thêm nội dung mới. Vui lòng không đăng câu trả lời trừ khi bạn thực sự có điều gì đó mới để đóng góp.
DavidPostill

@DavidPostill: Đây là giải pháp nhanh chóng cho người dùng "TL; DR" (như tôi)
vladkras

Đó không phải là lý do để thêm một câu trả lời mà không đóng góp gì mới. Trong mọi trường hợp, câu trả lời được chấp nhận sẽ luôn xuất hiện đầu tiên vì vậy nó sẽ được đọc trước câu trả lời của bạn.
DavidPostill

@DavidPostill, đừng bận tâm, nhưng câu trả lời chấp nhận chứa nhiều quá mức và không giải thích được phím /B, /R/COP đã không hỏi về, trong khi câu trả lời của tôi cho chính xác tương đương
vladkras

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

2

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.


1

http://www.multireplacer.com

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]

0

Bạn vẫn có thể sử dụng grepcác lệnh Linux quen thuộc và khác bằng cách tải xuống công cụ này UnxUtils và thêm vị trí của nó vào PATHbiến môi trường của bạn


unxutils grep không muộn như bạn có thể nhận được .. unx grep là thế 2.4.2nhưng gnuwin32 có một cái sau 2.5.4
barlop

0

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 doskeytrong 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 roottrên dấu nhắc lệnh.


nó cũng có bản dựng Android
barlop 18/07/2016

0

Nếu bạn muốn thêm đơn giản nhất grepvào môi trường windows của mình, thì hãy điều hướng đến c:\windows\system32và 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 lsnhư đượ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


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

Nhân tiện, câu trả lời buồn tẻ này có 44 lượt upvote
vladkras
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.