ripgrep — это инструмент линейного поиска, который рекурсивно ищет в текущем каталоге шаблон регулярного выражения. По умолчанию ripgrep будет соблюдать правила gitignore и автоматически пропускать скрытые файлы/каталоги и двоичные файлы. (Чтобы отключить всю автоматическую фильтрацию по умолчанию, используйте rg -uuu
.) ripgrep имеет первоклассную поддержку в Windows, macOS и Linux, при этом двоичные загрузки доступны для каждого выпуска. ripgrep похож на другие популярные инструменты поиска, такие как The Silver Searcher, ack и grep.
Двойная лицензия MIT или НЕЛИЦЕНЗИЯ.
Пожалуйста, ознакомьтесь с журналом изменений, чтобы узнать историю выпусков.
В этом примере выполняется поиск по всему дереву исходного кода ядра Linux (после запуска make defconfig && make -j8
) для [AZ]+_SUSPEND
, где все совпадения должны быть словами. Тайминги собирались на системе с Intel i9-12900K 5,2 ГГц.
Помните, что одного теста никогда не бывает достаточно! См. мой пост в блоге о ripgrep для очень подробного сравнения с другими тестами и анализом.
Инструмент | Команда | Количество строк | Время |
---|---|---|---|
рипгреп (Юникод) | rg -n -w '[AZ]+_SUSPEND' | 536 | 0,082 с (1,00x) |
гипергреп | hgrep -n -w '[AZ]+_SUSPEND' | 536 | 0,167 с (2,04x) |
git grep | git grep -P -n -w '[AZ]+_SUSPEND' | 536 | 0,273 с (3,34x) |
Серебряный искатель | ag -w '[AZ]+_SUSPEND' | 534 | 0,443 с (5,43x) |
угреп | ugrep -r --ignore-files --no-hidden -I -w '[AZ]+_SUSPEND' | 536 | 0,639 с (7,82x) |
git 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 -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 для файла, кэшированного в памяти (~13 ГБ, OpenSubtitles.raw.en.gz
, распакованный):
Инструмент | Команда | Количество строк | Время |
---|---|---|---|
рипгреп (Юникод) | rg -w 'Sherlock [AZ]w+' | 7882 | 1,042 с (1,00x) |
угреп | 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
.
Однако остерегайтесь резких скачков производительности:
Инструмент | Команда | Количество строк | Время |
---|---|---|---|
рипгреп (Юникод) | 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 -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 28,973 с (27,51x) |
А производительность может резко упасть по всем направлениям при поиске шаблонов в больших файлах без каких-либо возможностей для буквальной оптимизации:
Инструмент | Команда | Количество строк | Время |
---|---|---|---|
рипгреп | rg '[A-Za-z]{30}' | 6749 | 15,569 с (1,00x) |
угреп | 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 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
с помощью RegexSet
. Это означает, что один путь к файлу может одновременно сопоставляться с несколькими шаблонами glob.crossbeam
и ignore
.Энди Лестер, автор ack, опубликовал отличную таблицу, сравнивающую возможности ack, ag, git-grep, GNU grep и ripgrep: https://beyondgrep.com/feature-comparison/
Обратите внимание, что в ripgrep недавно появилось несколько важных новых функций, которых еще нет в таблице Энди. Сюда входят, помимо прочего, файлы конфигурации, сквозное соединение, поддержка поиска в сжатых файлах, многострочный поиск и поддержка необычных регулярных выражений через 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 из копра:
$ 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, 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. Это принесло пользу только транскодированию UTF-16. Поскольку для этого требовались нестабильные функции, этот режим сборки был подвержен поломкам. По этой причине его поддержка была прекращена. Если вам нужна оптимизация SIMD для перекодирования UTF-16, вам придется подать прошение encoding_rs
об использовании стабильных API.
Наконец, с помощью ripgrep можно реализовать дополнительную поддержку PCRE2, включив функцию 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
. Дополнительную информацию см. в разделе руководства Delta по grep.Чтобы сообщить об уязвимости безопасности, свяжитесь с Эндрю Галлантом. На странице контактов указан мой адрес электронной почты и открытый ключ PGP, если вы хотите отправить зашифрованное сообщение.
Ниже приводится список известных переводов документации ripgrep. Они поддерживаются неофициально и могут быть устаревшими.