Grep เทียบเท่าสำหรับ Windows 7?


241

grepพรอมต์คำสั่งเทียบเท่าสำหรับ Windows 7 หรือไม่ นั่นคือฉันต้องการกรองผลลัพธ์ของคำสั่ง:

ใช้ทุบตี:

ls | grep root

มันจะเป็นอะไรจากพรอมต์คำสั่งของ Windows


9
อย่าสับสน ms-dos ด้วยพรอมต์คำสั่ง + ใช้การค้นหาและ findstr และแม้กระทั่ง grep สำหรับ windows .. แน่นอนจะพบได้อย่างง่ายดายด้วยการค้นหาอย่างรวดเร็ว มีตารางคำสั่งที่เทียบเท่าใน linux และ windows นอกจากนี้คุณทุบตีตัวอย่างไม่ได้เฉพาะเจาะจงกับทุบตี .. เพียงแค่ฉันคิดว่า * nix OS
barlop

คำตอบ:


280

Findstrฟังดูเหมือนสิ่งที่คุณต้องการ ฉันใช้มันตลอดเวลาเพื่อเป็นค่าเทียบเท่า grep บนแพลตฟอร์ม Windows

อีกตัวอย่างด้วยท่อ:

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

ใช่ที่ดูเหมือนจะเป็นสิ่งที่ฉันกำลังมองหา ฉันเข้าใจว่าอาจมีข้อ จำกัด ฉันจะลองดู
chrisjlee

18
ทำไมพวกเขาถึงเรียกมันว่า grep ไม่ได้!
Victor Grazi

6
@VictorGrazi พวกเขาไม่จริงตอนแรกเห็นบทความนี้ เดิมชื่อ qgrep - แต่ถูกเปลี่ยนชื่อในภายหลัง
Zitrax

3
ปัญหาใหญ่findstrคือว่ารูปแบบ regex อาจไม่มีทางเลือก
Wolf

คำถามเกี่ยวกับ Windows 7 แต่ Windows รุ่นอื่น ๆ มีfindstrค่าเริ่มต้นเป็นอย่างไร ตั้งแต่ Windows XP ?
Peter Mortensen

44

มีความเป็นไปได้หลายประการ:

  • ใช้พอร์ตของgrepคำสั่งUnix มีหลายทางเลือก ผู้ทรงกล่าวถึงเป็น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 แทนที่จะใช้ emulator DLLs (เช่นcygwin1.dll) การวางซ้อนสิ่งต่าง ๆ บน Win32 และใช่ชุดเครื่องมือมีgrepพอ ๆ กับคนอื่น ๆ อีก 300 คน
  • ใช้grepคำสั่งWin32 ดั้งเดิมอย่างใดอย่างหนึ่งที่ผู้คนได้เขียนและเผยแพร่ Tim Charron มีgrep GNU ที่ดัดแปลงมาจาก Win32ตัวอย่างเช่น นอกจากนี้ยังมีPowerGREP , Bare Grep , grepWin , AstroGrepและdnGrepแม้ว่าสิ่งเหล่านี้เป็นโปรแกรม GUI ทั้งหมดไม่ใช่โปรแกรม TUI
  • ใช้ที่ให้มาและfind findstr ไวยากรณ์จะแตกต่างจากที่ของgrepทราบเช่นเดียวกับความสามารถในการแสดงออกปกติ

cygwin ได้ผลกับฉันเป็นอย่างดีใน Win 7 ฉันต้องการ grep และ GnuWin32 grep ไม่ทำงานสำหรับฉัน
Kozuch

คุณเขียนฉันไม่เห็น Perl ใน SUA C: \ Windows \ SUA> dir perl * / s / b ไม่พบไฟล์และทำงานเช่น c shell ของ SUA ฉันไม่เห็นใน / bin
barlop

คุณเขียนด้วยว่า SFUA นั้นดีกว่า ในรูปแบบใด?
barlop

@Kozuch เว้นแต่คุณจะระบุวิธีการที่จะไม่ทำงานแล้วความคิดเห็นของคุณไม่เป็นประโยชน์
barlop

19

หากอนุญาตให้ใช้คำสั่ง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"


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 ไม่ได้อยู่ในแพคเกจของตัวเอง

ที่เพิ่ม

grep ของ GnuWin32 เป็นครั้งสุดท้ายที่ฉันตรวจสอบว่าเป็นรุ่นเก่า grep ของ Cygwin มีความทันสมัยมากขึ้น โปรดจำไว้ว่าหลายคนใช้ Virtual Machines มากกว่า windows ports ของคำสั่ง * nix


9

หากคุณต้องการใช้grepแทนที่จะfindstrมี.exeไฟล์รุ่นเดียวในUnxUtilsดังนั้นจึงพกพาได้และไม่จำเป็นต้องติดตั้งหรือใช้สิ่งต่าง ๆ เช่น Cygwin


สิ่งนี้น่าสนใจ แต่จะต้องติดตั้งเครื่องมือนั้น
chrisjlee

3
@Chris: ไม่มีการติดตั้ง มันเป็นเพียง.zipไฟล์ของ.exeไฟล์ ข้อเสียเล็ก ๆ เท่านั้นคือรุ่นเก่าเล็กน้อย
Paradroid

6
ข้อเสียของการเป็นเก่าคืออะไร? ซอฟต์แวร์เก่าหรือไม่ ไบต์สดทั้งหมด
ผู้ใช้ที่ไม่รู้จัก

3
GnuWin32 ยังมีให้grepสำหรับ Windows: gnuwin32.sourceforge.net/packages/grep.htm
LiuYan 刘研

3
@userunknown เป็นตัวอย่างที่ดีคำสั่ง unxutils sed เก่ากว่าและไม่รองรับ \ d เช่น \ d22 เพื่อระบุเครื่องหมายคำพูด wget แบบเก่าอาจไม่ดาวน์โหลดหน้าเว็บที่ใหม่กว่าและหากคุณขอการสนับสนุนพวกเขาอาจขอให้คุณได้รับสิ่งใหม่ล่าสุดเพราะสามารถแก้ไขปัญหาบางอย่างได้ grep เก่าจริงๆไม่ต้องสงสัยเลยว่าจะไม่มีระดับของการสนับสนุน regex ที่มีอยู่ในปัจจุบัน
barlop

3

คุณสามารถลองติดตั้งChocolateyบน Windows และติดตั้งเครื่องมือGow สิ่งนี้จะช่วยให้คุณมีgrepบน Windows

Gowยืนสำหรับ GNU บน Windows มันมียูทิลิตี้บรรทัดคำสั่ง Unix บน Windows


1
มันเป็นตัวจัดการแพ็คเกจเช่น apt-get แต่สำหรับ windows มันได้ชื่อว่า 'cos นักพัฒนาที่ใช้มันจาก NuGet ซึ่งเป็นผู้จัดการแพคเกจสำหรับ visual studio และฟังดูเหมือน nugget (เหมือนกับใน nugget ไก่) ดังนั้นเขาจึงคิดว่าเขาจะ "ตลก" หรือ "ฉลาด" และโทร โปรแกรมของเขา Chocolatey NuGet ฉันได้ยินมาว่าพอดคาสต์สัมภาษณ์เขา Gow สามารถดาวน์โหลดได้อย่างอิสระเช่นกัน
barlop

1
ฉันใหม่สำหรับโกวหลังจากใช้งานไปสองสามวันฉันสามารถยืนยันได้ว่าฉันชอบมันมาก - ดีกว่าพอร์ตเก่า ๆ ของยูนิกซ์ที่ฉันเคยใช้มาก่อน
Radim Cernej

@RadimCernej ความคิดเห็นของคุณไม่มีประโยชน์เว้นแต่คุณจะระบุว่าคุณคิดว่าอย่างไรดีกว่า
barlop

@barlop: ตั้งแต่ฉันเขียนความคิดเห็น ม.ค. -2016 ของฉันฉันค่อยๆและเปลี่ยนไปใช้ Gow อย่างสมบูรณ์ จนถึงตอนนี้ไม่มีข้อบกพร่องมันมียูทิลิตี้ทั้งหมดที่ฉันต้องการ / ใช้เส้นทางเป็นผลลัพธ์ในรูปแบบของ Microsoft (ทำให้ง่ายต่อการคัดลอก / วางไปยังโปรแกรมอื่น ๆ ) Gow นั้นไม่รุกราน (ติดตั้งและนำออกได้ง่าย) ซึ่งฉันขอแนะนำให้คุณลองขับดู
Radim Cernej

2

ทุบตีการใช้งาน

$ ls | grep root

ใช้งาน Cmd

> dir /b | findstr root

โดยที่/bย่อมาจากbคือรายการของไดเรกทอรีและไฟล์


2
เป็นการทำซ้ำคำตอบอื่นและไม่เพิ่มเนื้อหาใหม่ โปรดอย่าโพสต์คำตอบเว้นแต่ว่าคุณมีสิ่งใหม่ที่จะมีส่วนร่วม
DavidPostill

@DavidPostill: นี่คือวิธีที่รวดเร็วสำหรับ "TL; DR" ผู้ใช้ (เช่นฉัน)
vladkras

นั่นไม่ใช่ข้อแก้ตัวสำหรับการเพิ่มคำตอบที่ไม่ได้ช่วยอะไรใหม่ ไม่ว่าในกรณีใดคำตอบที่ได้รับการยอมรับจะปรากฏขึ้นก่อนเสมอดังนั้นจึงจะถูกอ่านต่อหน้าคุณ
DavidPostill

@DavidPostill, ไม่ทราบ แต่คำตอบรับมีมากเกินไปและหลายที่ไม่สามารถอธิบายกุญแจ/B, /Rและ/COP ไม่ได้ถามเกี่ยวกับในขณะที่คำตอบของฉันให้แน่นอนเทียบเท่า
vladkras

/bคือการทำให้dirการส่งออกเช่นเดียวกับlsการส่งออก หากคุณทดสอบคุณจะเห็นความแตกต่าง ดังนั้นจึงไม่เทียบเท่าที่แน่นอน
DavidPostill

2

ฉันเขียนทางเลือก Windows เพื่อ grep โดยใช้รหัส Hybrid Batch / JScript ฉันเขียนสิ่งนี้เพราะการได้รับอักขระการหลบหนีที่ถูกต้องใน GNU Win32 grep port เป็นความเจ็บปวดที่แท้จริง รุ่นนี้ทำงานได้มากขึ้นเช่นเดียวกับที่คุณต้องการให้ 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);
        }
    }

}

คุณสามารถค้นหารุ่นล่าสุดได้ในหน้าสรุปสาระสำคัญของฉันสำหรับเรื่องนี้


1

http://www.multireplacer.com

มีการเตรียมโปรแกรม Multi replacer เพื่อให้สามารถใช้งานฟังก์ชันต่างๆได้โดยใช้พารามิเตอร์บรรทัดคำสั่ง การใช้บรรทัดคำสั่งมีดังนี้:

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ตัวแปรสภาพแวดล้อมของคุณ


grep unxutils ไม่ช้าเท่าที่คุณจะได้รับ .. grep unx เป็น2.4.2แต่ gnuwin32 มีหนึ่งในภายหลัง 2.5.4
barlop

0

ฉันขอแนะนำให้ใช้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กับพรอมต์คำสั่ง


มันมี Android build ด้วย
barlop

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 upvotes ในบล็อก dev dev ที่มีชื่อเสียงของรัสเซียhabrahabr.ru/post/71568
vladkras
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.