Утилита ripgrep является полезной альтернативой традиционной команде grep в Linux. И ripgrep, и grep используются для поиска в файлах определенных фрагментов текста. Однако ripgrep работает гораздо быстрее и использует интеллектуальные настройки по умолчанию, которые оптимальны для большинства пользователей. Это руководство содержит некоторые сведения о ripgrep, включая сравнение с другими инструментами поиска. В нем также объясняется, как установить и использовать ripgrep, и приводятся некоторые примеры типичного поиска.
Введение в ripgrep
ripgrep - это линейно-ориентированный инструмент с открытым исходным кодом, оптимизированный для рекурсивного поиска текста в файле или каталоге. Он пропускает скрытые файлы и каталоги и учитывает содержимое всех игнорируемых файлов. ripgrep доступен для Ubuntu и других дистрибутивов Linux, а также для macOS и Windows. Название инструмента намеренно не пишется с заглавной буквы.
Бенчмаркинговые тесты показывают, что ripgrep в среднем работает намного быстрее, чем другие инструменты текстового поиска. ripgrep более эффективен, поскольку использует механизм Rust regex, который использует конечную автоматизацию для ускорения поиска. Он также быстро итерирует каталоги, используя параллельную рекурсивную технику. Ripgrep автоматически выбирает, что использовать: карты памяти или промежуточный буфер. Карты памяти лучше всего подходят для отдельных файлов, а буферы - для больших каталогов. ripgrep включает в себя большинство функций, встречающихся в других инструментах поиска, но не обязательно имеет полный паритет с любым из них. Некоторые из наиболее важных функций ripgrep включают следующее:
- ripgrep обеспечивает полную поддержку Unicode, со встроенной поддержкой UTF-8 для поддержания производительности. Поддержка Юникода всегда включена.
ripgrep может предоставить дополнительный контекст для результатов поиска, позволяя пользователю указать количество строк до или после совпадения для отображения. Он также выделяет совпадения цветом. - ripgrep осуществляет поиск с учетом регистра, но также поддерживает поиск без учета регистра или интеллектуальный поиск. При интеллектуальном поиске поиск учитывает регистр только в том случае, если в поисковом выражении присутствует заглавная буква.
- Он позволяет пользователям искать несколько шаблонов или шаблон поиска, охватывающий несколько строк.
- Проверяет содержимое любых файлов .gitignore, ignore или rgignore и исключает эти записи из поиска. Используется набор regexSet для сопоставления пути к файлу с несколькими шаблонами одновременно.
- По умолчанию игнорируются скрытые и двоичные файлы.
- Можно ограничить поиск определенными типами файлов.
- Он обеспечивает дополнительную поддержку поискового механизма Perl Compatible Regular Expression 2 (PCRE2). Это позволяет использовать поиск по тексту, который предшествует или следует за совпадением, а также обратные ссылки.
- Он поддерживает различные текстовые кодировки, такие как UTF-8, UTF-16, latin-1, GBK, EUC-JP и Shift_JIS. Он также может искать файлы, сжатые с помощью наиболее распространенных утилит.
- ripgrep может взаимодействовать с фильтрами предварительной обработки входных данных для извлечения текста, расшифровки и автоматического определения кодировки.
Однако ripgrep не является POSIX-совместимым и не устанавливается на большинстве систем. Поэтому он не является хорошим выбором, если требуется переносимость.
Сравнение ripgrep с grep, ack и Silver Searcher
В качестве альтернативы ripgrep можно использовать хорошо знакомый инструмент grep, ack и ag, также известный как Silver Searcher. Самым большим преимуществом ripgrep является его скорость. В среднем он заметно быстрее других инструментов, что подтверждается несколькими эталонными тестами. Хотя он не всегда является самым быстрым инструментом в каждом конкретном случае, он гораздо эффективнее обрабатывает сложные запросы. Его техника параллельного поиска более эффективна при поиске в большом количестве файлов. Он также позволяет избежать наихудших сценариев, когда производительность сильно снижается при определенных параметрах поиска. Ripgrep использует Rust и коллекцию высокооптимизированных библиотек, в то время как другие инструменты поиска используют C или Perl.
В целом ripgrep конкурирует с другими инструментами в плане паритета возможностей. В некоторых случаях ему не хватает функции, которую предоставляет один из других инструментов, и наоборот. Вот более подробное сравнение между ripgrep и другими инструментами.
- Сравнение ripgrep и grep: Инструмент grep входит в стандартную спецификацию Linux и существует уже очень долгое время. Это означает, что он доступен почти на каждой системе. Он достаточно эффективен, но не так быстр, как ripgrep, особенно при работе с поиском в Unicode. Кроме того, у него не так много возможностей. Например, невозможно ограничить поиск определенным типом файлов, и он не игнорирует имена файлов, перечисленные в .gitignore. Он не предоставляет удобных для пользователя опций, таких как поиск в умном регистре, и не использует оптимизированные методы поиска, такие как параллельная итерация. Однако он поддерживает поиск, основанный на расширенных регулярных выражениях, чего не хватает ripgrep.
- Сравнение ripgrep и ack: ack release 3 использует Perl и предназначен для разработчиков, осуществляющих поиск в хранилищах исходного кода. Его преимущество - высокая переносимость, поскольку он может работать на любой платформе, поддерживающей Perl. По количеству поддерживаемых функций он сравним с ripgrep, но не так быстр.
- Сравнение ripgrep и Silver Searcher/ag: Программа Silver Searcher, вероятно, является лучшим сравнением для ripgrep. Обе программы предоставляют схожий набор оптимизирующих и удобных функций. Silver Searcher считается довольно быстрым, хотя ripgrep работает лучше в большинстве бенчмарков, и значительно лучше при поиске в Unicode. Silver Searcher использует несколько отличных от ripgrep методов поиска, включая поиск по кругу.
И ripgrep, и Silver Searcher считаются значительными улучшениями по сравнению со стандартной командой grep. ack следует рассматривать, если абсолютно необходима максимальная переносимость. Полезное сравнение различных инструментов на основе диаграмм можно найти на сайте Beyond Grep.
Как установить ripgrep
ripgrep обычно доступен в составе стандартного пакета для большинства дистрибутивов Linux и прост в установке. Его также можно установить с помощью менеджеров пакетов cargo или Homebrew.
Установка ripgrep в Ubuntu и Debian
Ripgrep доступен через APT для Ubuntu версии 18.10 или выше, а также для новейшего выпуска Debian. Чтобы установить ripgrep, выполните следующую команду.
1 | sudo apt-get install ripgrep |
Установка ripgrep на производные RHEL
Чтобы установить ripgrep на дистрибутивы RHEL или CentOS, следуйте приведенным ниже инструкциям. На CentOS пакет доступен для версии 7 и выше.
Добавьте репозиторий ripgrep с помощью Yum.
Чтобы использовать утилиту yum-config-manager, сначала необходимо установить пакет yum-utils. Его можно установить с помощью команды sudo yum install yum-utils.
1 | sudo yum-config-manager --add-repo=https://copr.fedorainfracloud.org/coprs/carlwgeorge/ripgrep/repo/epel-7/carlwgeorge-ripgrep-epel-7.repo |
Установите пакет ripgrep с помощью Yum.
1 | sudo yum install ripgrep |
Установите ripgrep на системы Fedora с помощью команды dnf install.
1 | sudo dnf install ripgrep |
Установка ripgrep с помощью Homebrew
Ripgrep также можно установить с помощью популярного менеджера пакетов Homebrew. Инструкции по установке Homebrew смотрите на их сайте. Используйте следующую команду для установки ripgrep с помощью Homebrew.
1 | brew install ripgrep |
Установка ripgrep с помощью Cargo
Поскольку ripgrep написан на языке Rust, его можно установить с помощью Cargo, менеджера пакетов Rust. Если Rust уже установлен в системе, то Cargo уже доступен. В противном случае Cargo может быть установлен как отдельная утилита с помощью команды sudo apt install cargo. Чтобы установить ripgrep с помощью Cargo, выполните следующую команду.
Примечание
Чтобы иметь возможность запускать исполняемые файлы Cargo, добавьте строку export PATH=$PATH:$HOME/.cargo/bin в файл .bashrc. Исправьте файл .bashrc, чтобы применить изменения.
1 | cargo install ripgrep |
Как использовать ripgrep
Исполняемый файл ripgrep известен как rg. Большинство команд имеет вид rg <шаблон_поиска> <файл>. Чтобы увидеть все параметры поиска, обратитесь к руководству пользователя ripgrep.
Чтобы посмотреть примечания по использованию rg и список всех опций, используйте опцию -help.
1 | rg -help |
Примеры в следующем разделе выполняют поиск в кодовой базе приложения PHP Composer с открытым исходным кодом.
Базовый поиск с помощью ripgrep
Для поиска конкретного файла используйте команду rg, за которой следует поисковый запрос и имя файла. ripgrep упорядочивает результаты по номеру строки. Соответствующий раздел каждой строки выделяется цветом.
1 | rg Exception InstalledVersions.php |
Вы также можете указать несколько файлов. В этом случае ripgrep группирует результаты по файлам.
1 | rg Exception InstalledVersions.php Cache.php |
Чтобы увидеть каждое совпадение с большим контекстом, используйте опцию -C вместе с количеством строк для отображения. Добавление -C 2 указывает ripgrep включить в вывод две строки, предшествующие и следующие за совпадением.
1 | rg Vendor InstalledVersions.php -C 2 |
Для большей детализации опции -B и -A позволяют указать количество строк до и после совпадающей строки. Чтобы отобразить две строки до и одну после, используйте rg [search_string] [directory] -B 2 -A 1.
1 | rg Vendor InstalledVersions.php -B 2 -A 1 |
По умолчанию поиск в ripgrep чувствителен к регистру. Для поиска без учета регистра используйте параметр -i. Если добавлена опция -S, ripgrep выполняет поиск с учетом регистра. В режиме умного регистра поиск становится чувствительным к регистру, если поисковый запрос включает заглавную букву.
1 | rg ssl Util/TlsHelper.php -i |
ripgrep рассматривает каждый шаблон поиска как регулярное выражение. Таким образом, можно легко искать любой набор строк, вставлять подстановочные знаки или искать повторяющиеся шаблоны. Заключите регулярное выражение в кавычки, чтобы синтаксический анализатор Linux передал его ripgrep в неизмененном виде. Первый пример ищет в файле либо Error, либо Exception. Второй пример ищет буквы t и p с любым символом между ними.
1 | rg 'Error|Exception' phpunit.xml.dist |
1 | rg 't.p' phpunit.xml.dist |
В некоторых случаях вы можете не захотеть, чтобы ripgrep рассматривал шаблон поиска как регулярное выражение. В этом случае используйте опцию -F, чтобы рассматривать строку поиска как строковый литерал.
Рекурсивный поиск с помощью ripgrep
Если имя файла или каталога не указано, ripgrep ищет шаблон рекурсивно, начиная с текущего каталога. Во время поиска ripgrep игнорирует все шаблоны, перечисленные в gitignore, ignore и .rgignore, а также скрытые файлы, скрытые каталоги и двоичные файлы. Он также не выполняет символические ссылки. Если ripgrep не выдает ожидаемых результатов, добавьте флаг --debug, чтобы включить информацию о трассировке.
Следующая команда выполняет рекурсивный поиск экземпляров ssl без учета регистра. Соответствующие строки нумеруются и группируются по файлам.
1 | rg ssl -i |
Также возможен рекурсивный поиск в определенном каталоге с использованием относительного или абсолютного пути. Укажите каталог в качестве второго аргумента после условия поиска. Полный путь к файлу будет отображен в выводе.
1 | rg ssl ~/phpcomposer/vendor/composer/ -i |
Чтобы отобразить файлы, содержащие совпадение, без соответствующих строк, используйте опцию list или -l. В следующем примере перечислены все файлы, содержащие строку key без каких-либо дополнительных сведений.
1 | rg key -l |
Фильтр с помощью ripgrep
ripgrep имеет несколько опций, позволяющих ограничить пространство поиска или отфильтровать результаты. Опция -t позволяет пользователям искать только в файлах определенного типа. ripgrep понимает большинство распространенных типов файлов. Например, опция -t md ищет только файлы Markdown. Другие часто используемые типы включают txt, sh, py, php, js, java, config и c. Чтобы посмотреть список доступных типов файлов, используйте команду rg --type-list.
1 | rg --type-list |
Следующая команда ограничивает поиск ключа шаблона только json-файлами.
1 | rg key -t json |
Поиск также можно ограничить именами файлов, соответствующими определенному шаблону, с помощью опции g, означающей "глобальный". Следующий поиск ищет ключ шаблона только в файлах, начинающихся с подстроки comp.
1 | rg -g 'comp*' key |
Ripgrep имеет и другие опции для фильтрации или форматирования результатов. Используйте команду rg --help для просмотра списка всех опций.
- -T для исключения файлов определенного типа.
- -w - отображать только совпадения, окруженные границами слов.
- -x для отображения только совпадений, окруженных границами строк.
- --trim - вырезать пробелы из результатов.
- --sort для сортировки результатов в порядке возрастания.
- -o - выводить только часть каждой строки, соответствующей шаблону поиска.
- -N - запретить отображение номера строки в каждом совпадении.
- -U для поиска совпадений в нескольких строках.
- -m <num> для ограничения количества совпадений до num результатов.
- --max-depth <num> для ограничения количества уровней подкаталогов для поиска до num уровней.
- --hidden для включения в поиск скрытых файлов и каталогов.
- -E для указания кодировки.
Заключение
Утилита ripgrep для Ubuntu и других дистрибутивов Linux - это быстрая и удобная альтернатива традиционной, но часто непостижимой команде grep. Она использует интеллектуальные настройки по умолчанию и пропускает скрытые файлы и записи, соответствующие шаблонам в файле .gitignore. ripgrep доступна для большинства дистрибутивов Linux, обычно в составе пакетов по умолчанию.
ripgrep очень интуитивно понятен в использовании, что показано на ряде примеров. Типичная команда ripgrep имеет формат, похожий на rg <шаблон_поиска> <каталог_файла>. Пользователи могут искать по одному файлу или рекурсивно в определенном каталоге. С помощью нескольких удобных опций, ripgrep может отображать больше строк вокруг поиска для лучшего контекста, или отображать только имена файлов без совпадающего текста.
По умолчанию ripgrep использует регулярные выражения, поэтому сложные поисковые запросы, основанные на определенных символах, легко построить. Результаты также могут быть отфильтрованы по типу файла или по глобальным шаблонам имен файлов. Команда rg --help выводит полный список опций. Руководство пользователя ripgrep содержит еще больше подробностей для тех, кто хочет освоить этот инструмент.