grepพรอมต์คำสั่งเทียบเท่าสำหรับ Windows 7 หรือไม่ นั่นคือฉันต้องการกรองผลลัพธ์ของคำสั่ง:
ใช้ทุบตี:
ls | grep root
มันจะเป็นอะไรจากพรอมต์คำสั่งของ Windows
grepพรอมต์คำสั่งเทียบเท่าสำหรับ Windows 7 หรือไม่ นั่นคือฉันต้องการกรองผลลัพธ์ของคำสั่ง:
ใช้ทุบตี:
ls | grep root
มันจะเป็นอะไรจากพรอมต์คำสั่งของ Windows
คำตอบ:
Findstrฟังดูเหมือนสิ่งที่คุณต้องการ ฉันใช้มันตลอดเวลาเพื่อเป็นค่าเทียบเท่า grep บนแพลตฟอร์ม Windows
อีกตัวอย่างด้วยท่อ:
C:\> dir /B | findstr /R /C:"[mp]"
findstr
คือว่ารูปแบบ regex อาจไม่มีทางเลือก
findstr
ค่าเริ่มต้นเป็นอย่างไร ตั้งแต่ Windows XP ?
มีความเป็นไปได้หลายประการ:
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 ทั้งหมดไม่ใช่โปรแกรม TUIfind
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 และชนะ 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
หากคุณต้องการใช้grep
แทนที่จะfindstr
มี.exe
ไฟล์รุ่นเดียวในUnxUtilsดังนั้นจึงพกพาได้และไม่จำเป็นต้องติดตั้งหรือใช้สิ่งต่าง ๆ เช่น Cygwin
.zip
ไฟล์ของ.exe
ไฟล์ ข้อเสียเล็ก ๆ เท่านั้นคือรุ่นเก่าเล็กน้อย
grep
สำหรับ Windows: gnuwin32.sourceforge.net/packages/grep.htm
คุณสามารถลองติดตั้งChocolateyบน Windows และติดตั้งเครื่องมือGow สิ่งนี้จะช่วยให้คุณมีgrep
บน Windows
Gow
ยืนสำหรับ GNU บน Windows มันมียูทิลิตี้บรรทัดคำสั่ง Unix บน Windows
ทุบตีการใช้งาน
$ ls | grep root
ใช้งาน Cmd
> dir /b | findstr root
โดยที่/b
ย่อมาจากbคือรายการของไดเรกทอรีและไฟล์
/B
, /R
และ/C
OP ไม่ได้ถามเกี่ยวกับในขณะที่คำตอบของฉันให้แน่นอนเทียบเท่า
/b
คือการทำให้dir
การส่งออกเช่นเดียวกับls
การส่งออก หากคุณทดสอบคุณจะเห็นความแตกต่าง ดังนั้นจึงไม่เทียบเท่าที่แน่นอน
ฉันเขียนทางเลือก 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);
}
}
}
คุณสามารถค้นหารุ่นล่าสุดได้ในหน้าสรุปสาระสำคัญของฉันสำหรับเรื่องนี้
มีการเตรียมโปรแกรม 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]
ฉันขอแนะนำให้ใช้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
สภาพแวดล้อม 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
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