ripgrep هي أداة بحث موجهة نحو الخط تقوم بالبحث بشكل متكرر في الدليل الحالي عن نمط regex. افتراضيًا، سيحترم ripgrep قواعد gitignore ويتخطى الملفات/الأدلة المخفية والملفات الثنائية تلقائيًا. (لتعطيل جميع عمليات التصفية التلقائية بشكل افتراضي، استخدم rg -uuu
.) يتمتع ripgrep بدعم من الدرجة الأولى على أنظمة التشغيل Windows وmacOS وLinux، مع توفر التنزيلات الثنائية لكل إصدار. يشبه ripgrep أدوات البحث الشائعة الأخرى مثل The Silver Searcher وack وgrep.
مرخص مزدوج بموجب MIT أو UNLICENSE.
يرجى الاطلاع على سجل التغيير للحصول على تاريخ الإصدار.
يبحث هذا المثال في شجرة مصدر نواة Linux بأكملها (بعد تشغيل make defconfig && make -j8
) لـ [AZ]+_SUSPEND
، حيث يجب أن تكون جميع المطابقات عبارة عن كلمات. تم جمع التوقيتات على نظام مزود بمعالج Intel i9-12900K بسرعة 5.2 جيجا هرتز.
يرجى تذكر أن معيارًا واحدًا لا يكفي أبدًا! راجع مشاركة مدونتي على ripgrep للحصول على مقارنة مفصلة للغاية مع المزيد من المعايير والتحليلات.
أداة | يأمر | عدد الخطوط | وقت |
---|---|---|---|
ريبجرب (يونيكود) | rg -n -w '[AZ]+_SUSPEND' | 536 | 0.082 ثانية (1.00x) |
com.hypergrep | hgrep -n -w '[AZ]+_SUSPEND' | 536 | 0.167 ثانية (2.04x) |
بوابة جريب | 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) |
بوابة جريب | LC_ALL=C git grep -E -n -w '[AZ]+_SUSPEND' | 536 | 0.727 ثانية (8.91x) |
بوابة جريب (يونيكود) | LC_ALL=en_US.UTF-8 git grep -E -n -w '[AZ]+_SUSPEND' | 536 | 2.670 ثانية (32.70x) |
ack | ack -w '[AZ]+_SUSPEND' | 2677 | 2.935 ثانية (35.94x) |
إليك معيارًا آخر في نفس المجموعة المذكورة أعلاه والذي يتجاهل ملفات gitignore ويبحث باستخدام القائمة البيضاء بدلاً من ذلك. المجموعة هي نفسها كما في المعيار السابق، والعلامات التي تم تمريرها إلى كل أمر تضمن أنها تقوم بعمل مماثل:
أداة | يأمر | عدد الخطوط | وقت |
---|---|---|---|
ripgrep | 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) |
جنو جريب | grep -E -r -n --include='*.c' --include='*.h' -w '[AZ]+_SUSPEND' | 447 | 0.674 ثانية (10.69x) |
سننتقل الآن إلى البحث في ملف واحد كبير. فيما يلي مقارنة مباشرة بين ripgrep و ugrep و GNU grep على ملف تم تخزينه مؤقتًا في الذاكرة (~13 جيجابايت، OpenSubtitles.raw.en.gz
، غير مضغوط):
أداة | يأمر | عدد الخطوط | وقت |
---|---|---|---|
ريبجرب (يونيكود) | rg -w 'Sherlock [AZ]w+' | 7882 | 1.042 ثانية (1.00x) |
ugrep | ugrep -w 'Sherlock [AZ]w+' | 7882 | 1.339 ثانية (1.28x) |
جنو جريب (يونيكود) | 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
.
احذر من منحدرات الأداء بالرغم من ذلك:
أداة | يأمر | عدد الخطوط | وقت |
---|---|---|---|
ريبجرب (يونيكود) | rg -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 1.053 ثانية (1.00x) |
جنو جريب (يونيكود) | 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) |
ويمكن أن ينخفض الأداء بشكل حاد في جميع المجالات عند البحث في الملفات الكبيرة عن الأنماط دون أي فرص للتحسينات الحرفية:
أداة | يأمر | عدد الخطوط | وقت |
---|---|---|---|
ripgrep | rg '[A-Za-z]{30}' | 6749 | 15.569 ثانية (1.00x) |
ugrep | ugrep -E '[A-Za-z]{30}' | 6749 | 21.857 ثانية (1.40x) |
جنو جريب | LC_ALL=C grep -E '[A-Za-z]{30}' | 6749 | 32.409 ثانية (2.08x) |
جنو جريب (يونيكود) | LC_ALL=en_US.UTF-8 grep -E '[A-Za-z]{30}' | 6795 | 8 د 30 ث (32.74 ×) |
أخيرًا، تميل أعداد التطابقات العالية أيضًا إلى أداء الخزان وتخفيف الاختلافات بين الأدوات (لأن الأداء يهيمن على مدى سرعة التعامل مع التطابق وليس الخوارزمية المستخدمة لاكتشاف التطابق، بشكل عام):
أداة | يأمر | عدد الخطوط | وقت |
---|---|---|---|
ripgrep | rg the | 83499915 | 6.948 ثانية (1.00x) |
ugrep | ugrep the | 83499915 | 11.721 ث (1.69x) |
جنو جريب | 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
باستخدام RegexSet
. وهذا يعني أنه يمكن مطابقة مسار ملف واحد مع أنماط متعددة في وقت واحد.crossbeam
ignore
.قام آندي ليستر، مؤلف كتاب ack، بنشر جدول ممتاز يقارن بين ميزات ack وag وgit-grep وGNU grep وripgrep: https://beyondgrep.com/feature-comparison/
لاحظ أن ripgrep قام مؤخرًا بتطوير بعض الميزات الجديدة المهمة والتي لم تكن موجودة بعد في جدول Andy. يتضمن ذلك، على سبيل المثال لا الحصر، ملفات التكوين، والتمرير، ودعم البحث في الملفات المضغوطة، والبحث متعدد الأسطر، والاشتراك في دعم التعبير العادي الرائع عبر PCRE2.
إذا كنت ترغب في تجربة ripgrep قبل التثبيت، فهناك ساحة لعب غير رسمية وبرنامج تعليمي تفاعلي.
إذا كانت لديك أي أسئلة حول هذه الأمور، فيرجى فتح مشكلة في مستودع البرنامج التعليمي.
الاسم الثنائي لـ 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 من الريبو الرسمي:
$ choco install ripgrep
إذا كنت من مستخدمي Windows Scoop ، فيمكنك تثبيت ripgrep من المجموعة الرسمية:
$ scoop install ripgrep
إذا كنت من مستخدمي Windows Winget ، فيمكنك تثبيت ripgrep من مستودع Winget-pkgs:
$ winget install BurntSushi.ripgrep.MSVC
إذا كنت من مستخدمي Arch Linux ، فيمكنك تثبيت ripgrep من المستودعات الرسمية:
$ sudo pacman -S ripgrep
إذا كنت من مستخدمي Gentoo ، فيمكنك تثبيت ripgrep من الريبو الرسمي:
$ 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 Stable، فستتم صيانة ripgrep رسميًا بواسطة Debian، على الرغم من أن إصداره قد يكون أقدم من حزمة deb
المتوفرة في الخطوة السابقة.
$ sudo apt-get install ripgrep
إذا كنت من مستخدمي Ubuntu Cosmic (18.10) (أو أحدث)، فإن ripgrep متاح باستخدام نفس الحزمة مثل Debian:
$ sudo apt-get install ripgrep
(ملاحظة: تتوفر أيضًا لقطات مختلفة لـ ripgrep على Ubuntu، ولكن لا يبدو أن أيًا منها يعمل بشكل صحيح وينتج عددًا من تقارير الأخطاء الغريبة جدًا التي لا أعرف كيفية إصلاحها وليس لدي الوقت لإصلاحها. لذلك، لم يعد خيار التثبيت الموصى به.)
إذا كنت من مستخدمي ALT ، فيمكنك تثبيت ripgrep من الريبو الرسمي:
$ 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 الثنائي مباشرةً من 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
لاستخدام واجهات برمجة التطبيقات الثابتة.
أخيرًا، يمكن إنشاء دعم 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 وإعادة بناء 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
. راجع قسم دليل دلتا على grep لمزيد من التفاصيل.للإبلاغ عن ثغرة أمنية، يرجى الاتصال بأندرو جالانت. تحتوي صفحة الاتصال على عنوان بريدي الإلكتروني ومفتاح PGP العام إذا كنت ترغب في إرسال رسالة مشفرة.
فيما يلي قائمة بالترجمات المعروفة لوثائق ripgrep. يتم الاحتفاظ بها بشكل غير رسمي وقد لا تكون محدثة.