ripgrep เป็นเครื่องมือค้นหาแบบบรรทัดซึ่งจะค้นหาไดเร็กทอรีปัจจุบันซ้ำ ๆ เพื่อหารูปแบบ regex ตามค่าเริ่มต้น ripgrep จะเคารพกฎ gitignore และข้ามไฟล์/ไดเร็กทอรีและไฟล์ไบนารีที่ซ่อนไว้โดยอัตโนมัติ (หากต้องการปิดใช้งานการกรองอัตโนมัติทั้งหมดตามค่าเริ่มต้น ให้ใช้ rg -uuu
) ripgrep มีการรองรับระดับเฟิร์สคลาสบน Windows, macOS และ Linux โดยมีการดาวน์โหลดไบนารี่สำหรับทุกรุ่น ripgrep นั้นคล้ายคลึงกับเครื่องมือค้นหายอดนิยมอื่น ๆ เช่น The Silver Searcher, ack และ grep
ได้รับใบอนุญาตแบบคู่ภายใต้ MIT หรือ UNLICENSE
โปรดดู CHANGELOG สำหรับประวัติการเปิดตัว
ตัวอย่างนี้ค้นหาแผนผังซอร์สเคอร์เนล Linux ทั้งหมด (หลังจากรัน make defconfig && make -j8
) สำหรับ [AZ]+_SUSPEND
โดยที่การจับคู่ทั้งหมดต้องเป็นคำ การกำหนดเวลาถูกรวบรวมบนระบบที่ใช้ Intel i9-12900K 5.2 GHz
โปรดจำไว้ว่าเกณฑ์มาตรฐานเดียวนั้นไม่เพียงพอ! ดูโพสต์บล็อกของฉันบน ripgrep สำหรับการเปรียบเทียบโดยละเอียดกับเกณฑ์มาตรฐานและการวิเคราะห์เพิ่มเติม
เครื่องมือ | สั่งการ | จำนวนบรรทัด | เวลา |
---|---|---|---|
ริปเกรป (Unicode) | rg -n -w '[AZ]+_SUSPEND' | 536 | 0.082 วินาที (1.00x) |
ไฮเปอร์เกรป | hgrep -n -w '[AZ]+_SUSPEND' | 536 | 0.167 วินาที (2.04x) |
คอมไพล์ grep | git grep -P -n -w '[AZ]+_SUSPEND' | 536 | 0.273 วินาที (3.34x) |
ผู้ค้นหาเงิน | ag -w '[AZ]+_SUSPEND' | 534 | 0.443 วินาที (5.43x) |
ugrep | ugrep -r --ignore-files --no-hidden -I -w '[AZ]+_SUSPEND' | 536 | 0.639 วินาที (7.82x) |
คอมไพล์ grep | LC_ALL=C git grep -E -n -w '[AZ]+_SUSPEND' | 536 | 0.727 วินาที (8.91x) |
git grep (ยูนิโค้ด) | LC_ALL=en_US.UTF-8 git grep -E -n -w '[AZ]+_SUSPEND' | 536 | 2.670 วินาที (32.70x) |
อ๊าก | ack -w '[AZ]+_SUSPEND' | 2677 | 2.935 วินาที (35.94x) |
นี่เป็นอีกหนึ่งเกณฑ์มาตรฐานในคลังข้อมูลเดียวกันกับด้านบน โดยไม่สนใจไฟล์ gitignore และค้นหาด้วยรายการที่อนุญาตพิเศษแทน คลังข้อมูลจะเหมือนกับในการวัดประสิทธิภาพก่อนหน้า และแฟล็กที่ส่งไปยังแต่ละคำสั่งช่วยให้แน่ใจว่าคำสั่งเหล่านั้นกำลังทำงานเทียบเท่ากัน:
เครื่องมือ | สั่งการ | จำนวนบรรทัด | เวลา |
---|---|---|---|
ริปเกรป | rg -uuu -tc -n -w '[AZ]+_SUSPEND' | 447 | 0.063 วินาที (1.00x) |
ugrep | ugrep -r -n --include='*.c' --include='*.h' -w '[AZ]+_SUSPEND' | 447 | 0.607 วินาที (9.62x) |
GNU กรีก | grep -E -r -n --include='*.c' --include='*.h' -w '[AZ]+_SUSPEND' | 447 | 0.674 วินาที (10.69x) |
ตอนนี้เราจะย้ายไปค้นหาไฟล์ขนาดใหญ่ไฟล์เดียว นี่คือการเปรียบเทียบแบบตรงระหว่าง ripgrep, ugrep และ GNU grep บนไฟล์ที่แคชไว้ในหน่วยความจำ (~ 13GB, OpenSubtitles.raw.en.gz
, คลายการบีบอัด):
เครื่องมือ | สั่งการ | จำนวนบรรทัด | เวลา |
---|---|---|---|
ริปเกรป (Unicode) | rg -w 'Sherlock [AZ]w+' | 7882 | 1.042 วินาที (1.00x) |
ugrep | ugrep -w 'Sherlock [AZ]w+' | 7882 | 1.339 วินาที (1.28x) |
GNU grep (ยูนิโค้ด) | LC_ALL=en_US.UTF-8 egrep -w 'Sherlock [AZ]w+' | 7882 | 6.577 วินาที (6.31x) |
ในเกณฑ์มาตรฐานข้างต้น การส่งแฟล็ก -n
(สำหรับการแสดงหมายเลขบรรทัด) จะเพิ่มเวลาเป็น 1.664s
สำหรับ ripgrep และ 9.484s
สำหรับ GNU grep เวลา ugrep จะไม่ได้รับผลกระทบจากการมีหรือไม่มี -n
ระวังหน้าผาประสิทธิภาพแม้ว่า:
เครื่องมือ | สั่งการ | จำนวนบรรทัด | เวลา |
---|---|---|---|
ริปเกรป (Unicode) | rg -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 1.053 วินาที (1.00x) |
GNU grep (ยูนิโค้ด) | LC_ALL=en_US.UTF-8 grep -E -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 6.234 วินาที (5.92x) |
ugrep | ugrep -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 28.973 วินาที (27.51x) |
และประสิทธิภาพอาจลดลงอย่างมากเมื่อค้นหาไฟล์ขนาดใหญ่เพื่อหารูปแบบโดยไม่มีโอกาสในการปรับให้เหมาะสมตามตัวอักษร:
เครื่องมือ | สั่งการ | จำนวนบรรทัด | เวลา |
---|---|---|---|
ริปเกรป | rg '[A-Za-z]{30}' | 6749 | 15.569 วินาที (1.00x) |
ugrep | ugrep -E '[A-Za-z]{30}' | 6749 | 21.857 วินาที (1.40x) |
GNU กรีก | LC_ALL=C grep -E '[A-Za-z]{30}' | 6749 | 32.409 วินาที (2.08x) |
GNU grep (ยูนิโค้ด) | LC_ALL=en_US.UTF-8 grep -E '[A-Za-z]{30}' | 6795 | 8 นาที 30 วินาที (32.74x) |
สุดท้าย จำนวนการจับคู่ที่สูงยังมีแนวโน้มที่จะส่งผลต่อประสิทธิภาพของรถถังและลดความแตกต่างระหว่างเครื่องมือต่างๆ (เนื่องจากประสิทธิภาพถูกครอบงำโดยความรวดเร็วในการจัดการการจับคู่ ไม่ใช่อัลกอริธึมที่ใช้ในการตรวจจับการจับคู่ พูดโดยทั่วไป):
เครื่องมือ | สั่งการ | จำนวนบรรทัด | เวลา |
---|---|---|---|
ริปเกรป | rg the | 83499915 | 6.948 วินาที (1.00x) |
ugrep | ugrep the | 83499915 | 11.721 วินาที (1.69x) |
GNU กรีก | LC_ALL=C grep the | 83499915 | 15.217 วินาที (2.19x) |
.gitignore
/ .ignore
/ .rgignore
ของคุณ มันจะไม่ค้นหาไฟล์ที่ซ่อนอยู่ และจะไม่ค้นหาไฟล์ไบนารี่ การกรองอัตโนมัติสามารถปิดใช้งานได้ด้วย rg -uuu
rg -tpy foo
จำกัดการค้นหาของคุณไว้ที่ไฟล์ Python และ rg -Tjs foo
จะไม่รวมไฟล์ JavaScript จากการค้นหาของคุณ สามารถสอน ripgrep เกี่ยวกับไฟล์ประเภทใหม่ด้วยกฎการจับคู่แบบกำหนดเองgrep
เช่น การแสดงบริบทของผลการค้นหา การค้นหาหลายรูปแบบ การเน้นการจับคู่ด้วยสี และการรองรับ Unicode เต็มรูปแบบ แตกต่างจาก GNU grep ripgrep ทำงานเร็วในขณะที่รองรับ Unicode (ซึ่งเปิดอยู่เสมอ)-P/--pcre2
(ใช้ PCRE2 เสมอ) หรือ --auto-hybrid-regex
(ใช้ PCRE2 หากจำเป็นเท่านั้น) ไวยากรณ์ทางเลือกมีให้ผ่านตัวเลือก --engine (default|pcre2|auto)
-E/--encoding
)-z/--search-zip
กล่าวอีกนัยหนึ่ง ให้ใช้ ripgrep หากคุณต้องการความเร็ว กรองตามค่าเริ่มต้น มีข้อบกพร่องน้อยลง และรองรับ Unicode
แม้ว่าในตอนแรกจะไม่ต้องการที่จะเพิ่มทุกคุณสมบัติภายใต้ดวงอาทิตย์ให้กับ ripgrep แต่เมื่อเวลาผ่านไป ripgrep ได้เพิ่มการรองรับคุณสมบัติส่วนใหญ่ที่พบในเครื่องมือค้นหาไฟล์อื่น ๆ ซึ่งรวมถึงการค้นหาผลลัพธ์ที่ครอบคลุมหลายบรรทัด และการเลือกรับการสนับสนุนสำหรับ PCRE2 ซึ่งให้การสนับสนุนการมองไปรอบ ๆ และการอ้างอิงย้อนหลัง
ณ จุดนี้ สาเหตุหลักที่จะไม่ใช้ ripgrep อาจประกอบด้วยอย่างน้อยหนึ่งอย่างต่อไปนี้:
โดยทั่วไปแล้วใช่ เกณฑ์มาตรฐานจำนวนมากพร้อมการวิเคราะห์โดยละเอียดสำหรับแต่ละรายการมีอยู่ในบล็อกของฉัน
โดยสรุป ripgrep นั้นรวดเร็วเพราะ:
-P/--pcre2
).gitignore
gitignore โดยใช้ RegexSet
นั่นหมายความว่าเส้นทางของไฟล์เดียวสามารถจับคู่กับรูปแบบ glob หลายรูปแบบพร้อมกันได้crossbeam
และ ignore
Andy Lester ผู้เขียน ack ได้เผยแพร่ตารางที่ยอดเยี่ยมเปรียบเทียบคุณสมบัติของ ack, ag, git-grep, GNU grep และ ripgrep: https://beyondgrep.com/feature-comparison/
โปรดทราบว่า ripgrep ได้เพิ่มฟีเจอร์ใหม่ที่สำคัญบางประการซึ่งยังไม่มีอยู่ในตารางของ Andy ซึ่งรวมถึงแต่ไม่จำกัดเฉพาะไฟล์การกำหนดค่า passthru การสนับสนุนสำหรับการค้นหาไฟล์บีบอัด การค้นหาหลายบรรทัด และการเลือกรับการสนับสนุน regex แฟนซีผ่าน PCRE2
หากคุณต้องการลองใช้ ripgrep ก่อนทำการติดตั้ง เรามีสนามเด็กเล่นที่ไม่เป็นทางการและบทช่วยสอนแบบโต้ตอบได้
หากคุณมีคำถามใดๆ เกี่ยวกับสิ่งเหล่านี้ โปรดเปิดปัญหาใน repo บทช่วยสอน
ชื่อไบนารีสำหรับ ripgrep คือ rg
ไฟล์เก็บถาวรของไบนารีที่คอมไพล์แล้วสำหรับ ripgrep พร้อมใช้งานสำหรับ Windows, macOS และ Linux ไบนารี Linux และ Windows เป็นไฟล์ปฏิบัติการแบบคงที่ ผู้ใช้แพลตฟอร์มที่ไม่ได้ระบุไว้อย่างชัดเจนด้านล่างควรดาวน์โหลดหนึ่งในไฟล์เก็บถาวรเหล่านี้
หากคุณเป็นผู้ใช้ macOS Homebrew หรือ Linuxbrew คุณสามารถติดตั้ง ripgrep จาก homebrew-core ได้:
$ brew install ripgrep
หากคุณเป็นผู้ใช้ MacPorts คุณสามารถติดตั้ง ripgrep ได้จากพอร์ตอย่างเป็นทางการ:
$ sudo port install ripgrep
หากคุณเป็นผู้ใช้ Windows Chocolatey คุณสามารถติดตั้ง ripgrep จาก repo อย่างเป็นทางการ:
$ choco install ripgrep
หากคุณเป็นผู้ใช้ Windows Scoop คุณสามารถติดตั้ง ripgrep จากที่ฝากข้อมูลอย่างเป็นทางการ:
$ scoop install ripgrep
หากคุณเป็นผู้ใช้ Windows Winget คุณสามารถติดตั้ง ripgrep จากที่เก็บ winget-pkgs ได้:
$ winget install BurntSushi.ripgrep.MSVC
หากคุณเป็นผู้ใช้ Arch Linux คุณสามารถติดตั้ง ripgrep ได้จาก repos อย่างเป็นทางการ:
$ sudo pacman -S ripgrep
หากคุณเป็นผู้ใช้ Gentoo คุณสามารถติดตั้ง ripgrep ได้จาก repo อย่างเป็นทางการ:
$ sudo emerge sys-apps/ripgrep
หากคุณเป็นผู้ใช้ Fedora คุณสามารถติดตั้ง ripgrep ได้จากแหล่งเก็บข้อมูลอย่างเป็นทางการ
$ sudo dnf install ripgrep
หากคุณเป็นผู้ใช้ openSUSE ripgrep จะรวมอยู่ใน openSUSE Tumbleweed และ openSUSE Leap ตั้งแต่เวอร์ชัน 15.1
$ sudo zypper install ripgrep
หากคุณเป็นผู้ใช้ RHEL/CentOS 7/8 คุณสามารถติดตั้ง ripgrep จาก copr ได้:
$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo=https://copr.fedorainfracloud.org/coprs/carlwgeorge/ripgrep/repo/epel-7/carlwgeorge-ripgrep-epel-7.repo
$ sudo yum install ripgrep
หากคุณเป็นผู้ใช้ Nix คุณสามารถติดตั้ง ripgrep จาก nixpkgs:
$ nix-env --install ripgrep
หากคุณเป็นผู้ใช้ Flox คุณสามารถติดตั้ง ripgrep ได้ดังนี้:
$ flox install ripgrep
หากคุณเป็นผู้ใช้ Guix คุณสามารถติดตั้ง ripgrep ได้จากคอลเลกชั่นแพ็คเกจอย่างเป็นทางการ:
$ guix install ripgrep
หากคุณเป็นผู้ใช้ Debian (หรือผู้ใช้อนุพันธ์ของ Debian เช่น Ubuntu ) สามารถติดตั้ง ripgrep ได้โดยใช้ไฟล์ไบนารี .deb
ที่ให้ไว้ใน ripgrep แต่ละรุ่น
$ curl -LO https://github.com/BurntSushi/ripgrep/releases/download/14.1.0/ripgrep_14.1.0-1_amd64.deb
$ sudo dpkg -i ripgrep_14.1.0-1_amd64.deb
หากคุณรัน Debian เสถียร Debian จะได้รับการดูแลอย่างเป็นทางการของ ripgrep แม้ว่าเวอร์ชันอาจเก่ากว่าแพ็คเกจ deb
ที่มีอยู่ในขั้นตอนก่อนหน้าก็ตาม
$ sudo apt-get install ripgrep
หากคุณเป็นผู้ใช้ Ubuntu Cosmic (18.10) (หรือใหม่กว่า) ripgrep จะพร้อมใช้งานโดยใช้บรรจุภัณฑ์เดียวกันกับ Debian:
$ sudo apt-get install ripgrep
(NB สแนปต่างๆ สำหรับ ripgrep บน Ubuntu ก็มีให้บริการเช่นกัน แต่ดูเหมือนว่าจะไม่มีอันใดที่ทำงานได้อย่างถูกต้องและสร้างรายงานข้อผิดพลาดแปลก ๆ มากมายที่ฉันไม่รู้วิธีแก้ไขและไม่มีเวลาแก้ไข ดังนั้น ไม่ใช่ตัวเลือกการติดตั้งที่แนะนำอีกต่อไป)
หากคุณเป็นผู้ใช้ ALT คุณสามารถติดตั้ง ripgrep จาก repo อย่างเป็นทางการ:
$ sudo apt-get install ripgrep
หากคุณเป็นผู้ใช้ FreeBSD คุณสามารถติดตั้ง ripgrep ได้จากพอร์ตอย่างเป็นทางการ:
$ sudo pkg install ripgrep
หากคุณเป็นผู้ใช้ OpenBSD คุณสามารถติดตั้ง ripgrep ได้จากพอร์ตอย่างเป็นทางการ:
$ doas pkg_add ripgrep
หากคุณเป็นผู้ใช้ NetBSD คุณสามารถติดตั้ง ripgrep จาก pkgsrc:
$ sudo pkgin install ripgrep
หากคุณเป็นผู้ใช้ Haiku x86_64 คุณสามารถติดตั้ง ripgrep ได้จากพอร์ตอย่างเป็นทางการ:
$ sudo pkgman install ripgrep
หากคุณเป็นผู้ใช้ Haiku x86_gcc2 คุณสามารถติดตั้ง ripgrep จากพอร์ตเดียวกันกับ Haiku x86_64 ได้โดยใช้บิลด์สถาปัตยกรรมรอง x86:
$ sudo pkgman install ripgrep_x86
หากคุณเป็นผู้ใช้ Void Linux คุณสามารถติดตั้ง ripgrep ได้จากพื้นที่เก็บข้อมูลอย่างเป็นทางการ:
$ sudo xbps-install -Syv ripgrep
หากคุณเป็น โปรแกรมเมอร์ Rust สามารถติดตั้ง ripgrep พร้อมกับ cargo
ได้
strip
บนไบนารี่ $ cargo install ripgrep
หรือคุณสามารถใช้ cargo binstall
เพื่อติดตั้ง ripgrep binary โดยตรงจาก GitHub:
$ cargo binstall ripgrep
ripgrep เขียนด้วยภาษา Rust ดังนั้นคุณจะต้องติดตั้ง Rust เพื่อคอมไพล์ ripgrep คอมไพล์ด้วย Rust 1.72.0 (เสถียร) หรือใหม่กว่า โดยทั่วไป ripgrep จะติดตามคอมไพเลอร์ Rust ที่เสถียรล่าสุด
วิธีสร้าง ripgrep:
$ git clone https://github.com/BurntSushi/ripgrep
$ cd ripgrep
$ cargo build --release
$ ./target/release/rg --version
0.1.3
หมายเหตุ: ในอดีต ripgrep รองรับฟีเจอร์ simd-accel
Cargo เมื่อใช้คอมไพเลอร์ Rust nightly สิ่งนี้เป็นประโยชน์ต่อการแปลงรหัส UTF-16 เท่านั้น เนื่องจากต้องใช้คุณสมบัติที่ไม่เสถียร โหมดบิลด์นี้จึงมีแนวโน้มที่จะเสียหายได้ ด้วยเหตุนี้ การสนับสนุนจึงถูกลบออก หากคุณต้องการเพิ่มประสิทธิภาพ SIMD สำหรับการแปลงรหัส UTF-16 คุณจะต้องยื่นคำร้องต่อโปรเจ็กต์ encoding_rs
เพื่อใช้ API ที่เสถียร
สุดท้ายนี้ การสนับสนุน PCRE2 เสริมสามารถสร้างขึ้นด้วย ripgrep ได้โดยเปิดใช้งานคุณสมบัติ pcre2
:
$ cargo build --release --features 'pcre2'
การเปิดใช้งานคุณสมบัติ PCRE2 จะทำงานร่วมกับคอมไพเลอร์ Rust ที่เสถียร และจะพยายามค้นหาและเชื่อมโยงกับไลบรารี PCRE2 ของระบบของคุณโดยอัตโนมัติผ่าน pkg-config
หากไม่มีอยู่ ripgrep จะสร้าง PCRE2 จากแหล่งที่มาโดยใช้คอมไพเลอร์ C ของระบบของคุณ จากนั้นเชื่อมโยงแบบคงที่เข้ากับไฟล์ปฏิบัติการขั้นสุดท้าย การลิงก์แบบสแตติกสามารถบังคับได้แม้ว่าจะมีไลบรารีระบบ PCRE2 ที่พร้อมใช้งานโดยการสร้าง ripgrep ด้วยเป้าหมาย MUSL หรือโดยการตั้งค่า PCRE2_SYS_STATIC=1
ripgrep สามารถสร้างได้ด้วยเป้าหมาย MUSL บน Linux โดยการติดตั้งไลบรารี MUSL บนระบบของคุณก่อน (ปรึกษาผู้จัดการแพ็คเกจพื้นที่ใกล้เคียงที่เป็นมิตรของคุณ) จากนั้นคุณเพียงแค่ต้องเพิ่มการรองรับ MUSL ให้กับ Rust toolchain ของคุณและสร้าง ripgrep ใหม่ ซึ่งจะทำให้สามารถเรียกทำงานแบบคงที่ได้อย่างสมบูรณ์:
$ rustup target add x86_64-unknown-linux-musl
$ cargo build --release --target x86_64-unknown-linux-musl
การใช้แฟล็ก --features
จากด้านบนใช้งานได้ตามที่คาดไว้ หากคุณต้องการสร้างไฟล์ปฏิบัติการแบบคงที่ด้วย MUSL และ PCRE2 คุณจะต้องติดตั้ง musl-gcc
ซึ่งอาจอยู่ในแพ็คเกจแยกต่างหากจากไลบรารี MUSL จริง ทั้งนี้ขึ้นอยู่กับการแจกจ่าย Linux ของคุณ
ripgrep ได้รับการทดสอบค่อนข้างดี รวมทั้งการทดสอบหน่วยและการทดสอบการรวม หากต้องการรันชุดการทดสอบแบบเต็ม ให้ใช้:
$ cargo test --all
จากรูทของพื้นที่เก็บข้อมูล
rg --json
ดังนั้นสิ่งที่คุณต้องทำเพื่อให้มันใช้งานได้คือ rg --json pattern | delta
ดูส่วนคู่มือของ delta บน grep สำหรับรายละเอียดเพิ่มเติมหากต้องการรายงานช่องโหว่ด้านความปลอดภัย โปรดติดต่อ Andrew Gallant หน้าติดต่อมีที่อยู่อีเมลของฉันและรหัสสาธารณะ PGP หากคุณต้องการส่งข้อความที่เข้ารหัส
ต่อไปนี้เป็นรายการคำแปลที่ทราบของเอกสารของ ripgrep สิ่งเหล่านี้ได้รับการดูแลอย่างไม่เป็นทางการและอาจไม่ทันสมัย