09.06.2020

RIPGREP - Быстрый, умный поиск содержимого в файлах. Установка в Linux / macOS.

Немного расскажу про ripgrep - быстрый поиск с возможностью замены по содержимому в файлах, аналог GREPASK, написан на RUST, понимает регулярные выражения, игнорирует ресурсы указанные в .gitignore, автоматически пропускает бинарные, скрытые файлы, много фич, углубиться в документацию можно в ОФИЦИАЛЬНОМ РЕПОЗИТОРИИ RIPGREP.

Почему быстрый, потому что есть сравнительные тесты (в репозитории приведены примеры) между grep, ag, git grep, ucg, pt, sift и соответственно ripgrep

Есть готовые пакеты под Linux, macOS, Windows, которые можно загрузить из раздела репозитория RELEASES. Ниже расскажу как установить ripgrep в Linux (CentOS) и macOS.

Почему ripgrep?

Есть несколько причин:

  • smart - как говорилось выше понимает .gitignore, не следует за символическими ссылками, пропускает бинарные и скрытые файлы
  • fast - быстрый, сотни файлов, в разы быстрее чем аналоги

Установка ripgrep в Linux

На сегодня текущий релиз ripgrep - 12.1.1, загрузить можно при помощи curl:

curl -LO https://github.com/BurntSushi/ripgrep/releases/download/12.1.1/ripgrep-12.1.1-x86_64-unknown-linux-musl.tar.gz

Далее распаковать архив:

tar -xf ripgrep-12.1.1-x86_64-unknown-linux-musl.tar.gz

Скопировать бинарь в нужное место:

cp ripgrep-*/rg /usr/local/bin/

Проверить установку:

rg --help

Установка ripgrep в macOS

При помощи brew:

brew install ripgrep

Проверить можно таким же образом:

rg --help

Примеры использования

Здесь на самом деле очень долго можно писать, расскажу о базовых вещах на примере репозитория ripgrep, который можно клонировать, перейти в каталог репозитория:

git clone https://github.com/BurntSushi/ripgrep && cd ripgrep

 И попробовать отыскать все TODO комментарии в репозитории:

rg 'TODO'

Результат:

crates/ignore/src/gitignore.rs
523:        // TODO: This should not return a `Result`. Fix this in the next semver

crates/ignore/src/overrides.rs
148:        // TODO: This should not return a `Result`. Fix this in the next semver

crates/regex/src/literal.rs
50:        // TODO: The logic in this function is basically inscrutable. It grew
395:        // TODO: Make these pass. We're missing some potentially big wins

crates/searcher/src/sink.rs
588:                // TODO: In theory, it should be possible to amortize

tests/binary.rs
25:// TODO: Add tests for binary file detection when using memory maps.

tests/regression.rs
179:// TODO(burntsushi): Darwin doesn't like this test for some reason. Probably
192:// TODO(burntsushi): Figure out how to make this test work on Windows. Right

Можно вывести просто список файлов:

rg -l 'TODO'

Результат:

crates/ignore/src/gitignore.rs
crates/ignore/src/overrides.rs
crates/regex/src/literal.rs
crates/searcher/src/sink.rs
tests/binary.rs
tests/regression.rs

Можно отсортировать вывод при помощи аргументов --sort  или --sortr (инвертировать) например по дате изменения:

rg -l 'TODO' --sortr modified

Или инвертировать по месторасположению:

rg -l 'TODO' --sortr path

Можно найти файлы, которые не содержат TODO:

rg --files-without-match 'TODO'

Можно сделать исключение из результатов через пайп:

rg -v 'burntsushi' | rg 'TODO'

Посмотреть изменения в репозитории:

git show | rg '^[-+]' | rg -v '^[-+]{3}' | sort | uniq

Можно из "коробки" использовать специальные символы без экранирования:

rg -F '?.'

Посмотреть что есть вокруг искомых строк:

rg -v 'burntsushi' | rg 'TODO' -A 2 -C1

Можно указать тип файлов, например md:

rg -t md -F '```rust'

Комментарии