ripgrep adalah alat pencarian berorientasi garis yang secara rekursif mencari pola regex di direktori saat ini. Secara default, ripgrep akan mematuhi aturan gitignore dan secara otomatis melewati file/direktori tersembunyi dan file biner. (Untuk menonaktifkan semua pemfilteran otomatis secara default, gunakan rg -uuu
.) ripgrep memiliki dukungan kelas satu di Windows, macOS dan Linux, dengan unduhan biner tersedia untuk setiap rilis. ripgrep mirip dengan alat pencarian populer lainnya seperti The Silver Searcher, ack dan grep.
Berlisensi ganda di bawah MIT atau UNLICENSE.
Silakan lihat CHANGELOG untuk riwayat rilis.
Contoh ini mencari seluruh pohon sumber kernel Linux (setelah menjalankan make defconfig && make -j8
) untuk [AZ]+_SUSPEND
, yang semua kecocokannya harus berupa kata. Pengaturan waktu dikumpulkan pada sistem dengan Intel i9-12900K 5,2 GHz.
Harap diingat bahwa satu tolok ukur saja tidak pernah cukup! Lihat postingan blog saya di ripgrep untuk perbandingan yang sangat mendetail dengan lebih banyak tolok ukur dan analisis.
Alat | Memerintah | Jumlah garis | Waktu |
---|---|---|---|
ripgrep (Unicode) | rg -n -w '[AZ]+_SUSPEND' | 536 | 0,082 detik (1,00x) |
hipergrep | hgrep -n -w '[AZ]+_SUSPEND' | 536 | 0,167 detik (2,04x) |
git grep | git grep -P -n -w '[AZ]+_SUSPEND' | 536 | 0,273 detik (3,34x) |
Pencari Perak | ag -w '[AZ]+_SUSPEND' | 534 | 0,443 detik (5,43x) |
jelek | ugrep -r --ignore-files --no-hidden -I -w '[AZ]+_SUSPEND' | 536 | 0,639 detik (7,82x) |
git grep | LC_ALL=C git grep -E -n -w '[AZ]+_SUSPEND' | 536 | 0,727 detik (8,91x) |
git grep (Unicode) | LC_ALL=en_US.UTF-8 git grep -E -n -w '[AZ]+_SUSPEND' | 536 | 2,670 detik (32,70x) |
ack | ack -w '[AZ]+_SUSPEND' | 2677 | 2,935 detik (35,94x) |
Berikut tolok ukur lain pada korpus yang sama seperti di atas yang mengabaikan file gitignore dan mencari dengan daftar putih. Korpusnya sama seperti pada benchmark sebelumnya, dan flag yang diteruskan ke setiap perintah memastikan bahwa perintah tersebut melakukan pekerjaan yang setara:
Alat | Memerintah | Jumlah garis | Waktu |
---|---|---|---|
ripgrep | rg -uuu -tc -n -w '[AZ]+_SUSPEND' | 447 | 0,063 detik (1,00x) |
jelek | ugrep -r -n --include='*.c' --include='*.h' -w '[AZ]+_SUSPEND' | 447 | 0,607 detik (9,62x) |
GNU mengerti | grep -E -r -n --include='*.c' --include='*.h' -w '[AZ]+_SUSPEND' | 447 | 0,674 detik (10,69x) |
Sekarang kita akan beralih ke pencarian pada satu file besar. Berikut adalah perbandingan langsung antara ripgrep, ugrep dan GNU grep pada file yang di-cache di memori (~13GB, OpenSubtitles.raw.en.gz
, didekompresi):
Alat | Memerintah | Jumlah garis | Waktu |
---|---|---|---|
ripgrep (Unicode) | rg -w 'Sherlock [AZ]w+' | 7882 | 1,042 detik (1,00x) |
jelek | ugrep -w 'Sherlock [AZ]w+' | 7882 | 1,339 detik (1,28x) |
grep GNU (Unicode) | LC_ALL=en_US.UTF-8 egrep -w 'Sherlock [AZ]w+' | 7882 | 6,577 detik (6,31x) |
Pada benchmark di atas, meneruskan flag -n
(untuk menampilkan nomor baris) akan menambah waktu menjadi 1.664s
untuk ripgrep dan 9.484s
untuk GNU grep. waktu ugrep tidak terpengaruh oleh ada atau tidaknya -n
.
Namun berhati-hatilah terhadap penurunan kinerja:
Alat | Memerintah | Jumlah garis | Waktu |
---|---|---|---|
ripgrep (Unicode) | rg -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 1,053 detik (1,00x) |
grep GNU (Unicode) | LC_ALL=en_US.UTF-8 grep -E -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 6,234 detik (5,92x) |
jelek | ugrep -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 28,973 detik (27,51x) |
Dan kinerja dapat turun drastis saat mencari pola pada file besar tanpa ada peluang untuk pengoptimalan literal:
Alat | Memerintah | Jumlah garis | Waktu |
---|---|---|---|
ripgrep | rg '[A-Za-z]{30}' | 6749 | 15,569 detik (1,00x) |
jelek | ugrep -E '[A-Za-z]{30}' | 6749 | 21,857 detik (1,40x) |
GNU mengerti | LC_ALL=C grep -E '[A-Za-z]{30}' | 6749 | 32,409 detik (2,08x) |
grep GNU (Unicode) | LC_ALL=en_US.UTF-8 grep -E '[A-Za-z]{30}' | 6795 | 8 menit 30 detik (32,74x) |
Terakhir, jumlah kecocokan yang tinggi juga cenderung meningkatkan performa tank dan memperhalus perbedaan antar alat (karena performa didominasi oleh seberapa cepat seseorang dapat menangani kecocokan dan bukan algoritma yang digunakan untuk mendeteksi kecocokan, secara umum):
Alat | Memerintah | Jumlah garis | Waktu |
---|---|---|---|
ripgrep | rg the | 83499915 | 6,948 detik (1,00x) |
jelek | ugrep the | 83499915 | 11,721 detik (1,69x) |
GNU mengerti | LC_ALL=C grep the | 83499915 | 15,217 detik (2,19x) |
.gitignore
/ .ignore
/ .rgignore
Anda, tidak akan mencari file tersembunyi dan tidak akan mencari file biner. Pemfilteran otomatis dapat dinonaktifkan dengan rg -uuu
.rg -tpy foo
membatasi pencarian Anda pada file Python dan rg -Tjs foo
mengecualikan file JavaScript dari pencarian Anda. ripgrep dapat diajarkan tentang tipe file baru dengan aturan pencocokan khusus.grep
, seperti menampilkan konteks hasil pencarian, mencari berbagai pola, menyorot kecocokan dengan warna dan dukungan penuh Unicode. Tidak seperti GNU grep, ripgrep tetap cepat sambil mendukung Unicode (yang selalu aktif).-P/--pcre2
(selalu gunakan PCRE2) atau --auto-hybrid-regex
(gunakan PCRE2 hanya jika diperlukan). Sintaks alternatif disediakan melalui opsi --engine (default|pcre2|auto)
.-E/--encoding
.)-z/--search-zip
.Dengan kata lain, gunakan ripgrep jika Anda menyukai kecepatan, pemfilteran secara default, lebih sedikit bug, dan dukungan Unicode.
Meskipun awalnya tidak ingin menambahkan setiap fitur ke ripgrep, seiring berjalannya waktu, ripgrep telah mengembangkan dukungan untuk sebagian besar fitur yang ditemukan di alat pencarian file lainnya. Hal ini mencakup pencarian hasil yang tersebar di berbagai lini, dan dukungan opt-in untuk PCRE2, yang menyediakan dukungan melihat-lihat dan referensi balik.
Pada titik ini, alasan utama untuk tidak menggunakan ripgrep mungkin terdiri dari satu atau lebih hal berikut:
Secara umum, ya. Sejumlah besar tolok ukur dengan analisis terperinci untuk masing-masing tolok ukur tersedia di blog saya.
Ringkasnya, ripgrep cepat karena:
-P/--pcre2
.).gitignore
menggunakan RegexSet
. Itu berarti satu jalur file dapat dicocokkan dengan beberapa pola glob secara bersamaan.crossbeam
dan ignore
.Andy Lester, penulis ack, telah menerbitkan tabel luar biasa yang membandingkan fitur ack, ag, git-grep, GNU grep dan ripgrep: https://beyondgrep.com/feature-comparison/
Perhatikan bahwa ripgrep telah mengembangkan beberapa fitur baru yang signifikan baru-baru ini yang belum ada di tabel Andy. Ini termasuk, namun tidak terbatas pada, file konfigurasi, passthru, dukungan untuk mencari file terkompresi, pencarian multiline dan dukungan regex mewah melalui PCRE2.
Jika Anda ingin mencoba ripgrep sebelum menginstal, terdapat taman bermain tidak resmi dan tutorial interaktif.
Jika Anda memiliki pertanyaan tentang hal ini, silakan buka masalah di repo tutorial.
Nama biner untuk ripgrep adalah rg
.
Arsip binari yang telah dikompilasi untuk ripgrep tersedia untuk Windows, macOS dan Linux. Biner Linux dan Windows adalah executable statis. Pengguna platform yang tidak disebutkan secara eksplisit di bawah ini disarankan untuk mengunduh salah satu arsip ini.
Jika Anda pengguna macOS Homebrew atau Linuxbrew , Anda dapat menginstal ripgrep dari homebrew-core:
$ brew install ripgrep
Jika Anda pengguna MacPorts , Anda dapat menginstal ripgrep dari port resmi:
$ sudo port install ripgrep
Jika Anda pengguna Windows Chocolatey , Anda dapat menginstal ripgrep dari repo resmi:
$ choco install ripgrep
Jika Anda pengguna Windows Scoop , Anda dapat menginstal ripgrep dari wadah resmi:
$ scoop install ripgrep
Jika Anda pengguna Windows Winget , Anda dapat menginstal ripgrep dari repositori winget-pkgs:
$ winget install BurntSushi.ripgrep.MSVC
Jika Anda pengguna Arch Linux , Anda dapat menginstal ripgrep dari repo resmi:
$ sudo pacman -S ripgrep
Jika Anda pengguna Gentoo , Anda dapat menginstal ripgrep dari repo resmi:
$ sudo emerge sys-apps/ripgrep
Jika Anda pengguna Fedora , Anda dapat menginstal ripgrep dari repositori resmi.
$ sudo dnf install ripgrep
Jika Anda pengguna openSUSE , ripgrep disertakan dalam openSUSE Tumbleweed dan openSUSE Leap sejak 15.1.
$ sudo zypper install ripgrep
Jika Anda pengguna RHEL/CentOS 7/8 , Anda dapat menginstal ripgrep dari 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
Jika Anda pengguna Nix , Anda dapat menginstal ripgrep dari nixpkgs:
$ nix-env --install ripgrep
Jika Anda pengguna Flox , Anda dapat menginstal ripgrep sebagai berikut:
$ flox install ripgrep
Jika Anda pengguna Guix , Anda dapat menginstal ripgrep dari koleksi paket resmi:
$ guix install ripgrep
Jika Anda adalah pengguna Debian (atau pengguna turunan Debian seperti Ubuntu ), maka ripgrep dapat diinstal menggunakan file biner .deb
yang disediakan di setiap rilis 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
Jika Anda menjalankan Debian stable, ripgrep secara resmi dikelola oleh Debian, meskipun versinya mungkin lebih lama dari paket deb
yang tersedia pada langkah sebelumnya.
$ sudo apt-get install ripgrep
Jika Anda pengguna Ubuntu Cosmic (18.10) (atau lebih baru), ripgrep tersedia menggunakan kemasan yang sama dengan Debian:
$ sudo apt-get install ripgrep
(NB Berbagai snap untuk ripgrep di Ubuntu juga tersedia, tetapi tampaknya tidak ada satupun yang berfungsi dengan baik dan menghasilkan sejumlah laporan bug yang sangat aneh yang saya tidak tahu cara memperbaikinya dan tidak punya waktu untuk memperbaikinya. Oleh karena itu, ini bukan lagi opsi instalasi yang disarankan.)
Jika Anda pengguna ALT , Anda dapat menginstal ripgrep dari repo resmi:
$ sudo apt-get install ripgrep
Jika Anda pengguna FreeBSD , Anda dapat menginstal ripgrep dari port resmi:
$ sudo pkg install ripgrep
Jika Anda pengguna OpenBSD , Anda dapat menginstal ripgrep dari port resmi:
$ doas pkg_add ripgrep
Jika Anda pengguna NetBSD , Anda dapat menginstal ripgrep dari pkgsrc:
$ sudo pkgin install ripgrep
Jika Anda pengguna Haiku x86_64 , Anda dapat menginstal ripgrep dari port resmi:
$ sudo pkgman install ripgrep
Jika Anda pengguna Haiku x86_gcc2 , Anda dapat menginstal ripgrep dari port yang sama dengan Haiku x86_64 menggunakan build arsitektur sekunder x86:
$ sudo pkgman install ripgrep_x86
Jika Anda pengguna Void Linux , Anda dapat menginstal ripgrep dari repositori resmi:
$ sudo xbps-install -Syv ripgrep
Jika Anda seorang programmer Rust , ripgrep dapat diinstal dengan cargo
.
strip
pada biner. $ cargo install ripgrep
Alternatifnya, seseorang dapat menggunakan cargo binstall
untuk menginstal biner ripgrep langsung dari GitHub:
$ cargo binstall ripgrep
ripgrep ditulis dalam Rust, jadi Anda harus mengambil instalasi Rust untuk mengkompilasinya. ripgrep dikompilasi dengan Rust 1.72.0 (stabil) atau lebih baru. Secara umum, ripgrep melacak rilis stabil terbaru dari kompiler Rust.
Untuk membangun ripgrep:
$ git clone https://github.com/BurntSushi/ripgrep
$ cd ripgrep
$ cargo build --release
$ ./target/release/rg --version
0.1.3
CATATAN: Di masa lalu, ripgrep mendukung fitur simd-accel
Cargo saat menggunakan kompiler Rust nightly. Ini hanya menguntungkan transcoding UTF-16. Karena memerlukan fitur yang tidak stabil, mode build ini rentan terhadap kerusakan. Karena itu, dukungan terhadapnya telah dihapus. Jika Anda ingin pengoptimalan SIMD untuk transcoding UTF-16, Anda harus mengajukan petisi kepada proyek encoding_rs
untuk menggunakan API yang stabil.
Terakhir, dukungan opsional PCRE2 dapat dibangun dengan ripgrep dengan mengaktifkan fitur pcre2
:
$ cargo build --release --features 'pcre2'
Mengaktifkan fitur PCRE2 berfungsi dengan kompiler Rust yang stabil dan akan mencoba menemukan dan menautkan secara otomatis dengan perpustakaan PCRE2 sistem Anda melalui pkg-config
. Jika tidak ada, maka ripgrep akan membangun PCRE2 dari sumber menggunakan kompiler C sistem Anda dan kemudian menghubungkannya secara statis ke dalam executable akhir. Tautan statis dapat dipaksakan bahkan ketika perpustakaan sistem PCRE2 tersedia dengan membangun ripgrep dengan target MUSL atau dengan mengatur PCRE2_SYS_STATIC=1
.
ripgrep dapat dibangun dengan target MUSL di Linux dengan terlebih dahulu menginstal perpustakaan MUSL pada sistem Anda (konsultasikan dengan manajer paket ramah lingkungan Anda). Kemudian Anda hanya perlu menambahkan dukungan MUSL ke toolchain Rust Anda dan membangun kembali ripgrep, yang menghasilkan eksekusi yang sepenuhnya statis:
$ rustup target add x86_64-unknown-linux-musl
$ cargo build --release --target x86_64-unknown-linux-musl
Menerapkan tanda --features
dari atas berfungsi seperti yang diharapkan. Jika Anda ingin membuat executable statis dengan MUSL dan PCRE2, Anda perlu menginstal musl-gcc
, yang mungkin berada dalam paket terpisah dari pustaka MUSL sebenarnya, bergantung pada distribusi Linux Anda.
ripgrep relatif telah teruji dengan baik, termasuk pengujian unit dan pengujian integrasi. Untuk menjalankan rangkaian pengujian lengkap, gunakan:
$ cargo test --all
dari root repositori.
rg --json
. Jadi yang perlu Anda lakukan untuk membuatnya berfungsi adalah rg --json pattern | delta
. Lihat bagian manual delta di grep untuk lebih jelasnya.Untuk melaporkan kerentanan keamanan, silakan hubungi Andrew Gallant. Halaman kontak memiliki alamat email saya dan kunci publik PGP jika Anda ingin mengirim pesan terenkripsi.
Berikut ini adalah daftar terjemahan dokumentasi ripgrep yang diketahui. Ini dipelihara secara tidak resmi dan mungkin tidak mutakhir.