LINUX.ORG.RU

ripgrep 15.0.0

 ripgrep, , , ,


1

6

16 октября, после более года разработки, состоялся выпуск 15.0.0 быстрой кроссплатформенной консольной утилиты ripgrep, предназначенной для многопоточного рекурсивного поиска текста в файлах.

По умолчанию ripgrep использует поиск по регулярному выражению в файлах текущей директории, учитывает правила .gitignore и автоматически пропускает двоичные файлы и скрытые файлы и директории.

Утилита написана на языке программирования Rust и распространяется по лицензии MIT или Unlicense.

Основные изменения:

  • Исправлено несколько ошибок сопоставления правилам .gitignore. Среди них часто встречающаяся ошибка, связанная с применением правил .gitignore из родительских директорий.
  • Исправлена регрессия использования памяти при обработке очень больших файлов .gitignore.
  • rg -vf file теперь соответствует всему, если file пустой.
  • Опция -r/--replace теперь работает с опцией --json.
  • Подмножество репозиториев Jujutsu (jj) теперь обрабатывается так, как если бы они были репозиториями git. То есть ripgrep будет учитывать .gitignores jj.
  • Теперь в шаблонах глобов можно использовать вложенные фигурные скобки.
  • Улучшена производительность при использовании больших значений параметра опции -A/--after-context.
  • Множество улучшений в наборе типов файлов, доступных для фильтрации по умолчанию.
  • Автодополнения для fishshell учитывают конфигурационный файл ripgrep.
  • В список доступных атрибутов стиля опции --color добавлен курсив.
  • При использовании многопоточности поиск файлов производится в указанном пользователем порядке.
  • Добавлен тип цвета highlight для стилизации несовпадающего текста в совпадающей строке.
  • Улучшено автодополнение для --hyperlink-format в bash, fish и zsh.
  • Исправлено большое количество ошибок.

>>> Подробности на GitHub

★★★★★

Проверено: CrX ()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от bread

Но это не замена grep

Ещё как замена.

Рекурсивный обход дерева файловой системы не является задачей grep

Про флаг -r слышал?

Если же использовать сабж именно как grep, то это из пушки по воробьям

Ну из пушки и из пушки, мне-то что.

Чтобы грепнуть ввод тащить стремный комбайн на недоязычке, требующем гигабайты мусора для сборки. Нутакое!

А я его не собираю. У меня лежит бинарник /usr/bin/rg размером в 5 MB.

vbr ★★★★★
()
Ответ на: комментарий от wandrien

Ну вот прям щас проверил.

% head -c 1000000000 /dev/urandom |base64 > data

% time grep -c '[hj]\{3,\}' data
38212
grep -c '[hj]\{3,\}' data  1.21s user 0.10s system 99% cpu 1.320 total

% time grep -c '[hj]\{3,\}' data
38212
grep -c '[hj]\{3,\}' data  1.19s user 0.12s system 99% cpu 1.311 total

% time grep -c '[hj]\{3,\}' data
38212
grep -c '[hj]\{3,\}' data  1.19s user 0.11s system 99% cpu 1.310 total

% time rg -c '[hj]{3,}' data
38212
rg -c '[hj]{3,}' data  0.17s user 0.04s system 95% cpu 0.227 total

% time rg -c '[hj]{3,}' data
38212
rg -c '[hj]{3,}' data  0.14s user 0.05s system 99% cpu 0.188 total

% time rg -c '[hj]{3,}' data
38212
rg -c '[hj]{3,}' data  0.14s user 0.05s system 99% cpu 0.191 total

На простейшем регэкспе и файле размером в 1.3 GB rg работает в 6 раз быстрей.

Даже не пожалею ресурса SSD, сделаю 130 GB, чтобы кеширование убрать.

vbr ★★★★★
()
Ответ на: комментарий от vbr

А смысл практический в чем?

Я единственный раз видел, когда практическая задача упиралась в grep - когда на дешевой VPS-ке запускал греп по логам веб-сервера. Видимо, там проц совсем урезан был.

Не ну если у вас есть практическая задача, где требуется грепать гигабайт данных за 0.14s – пользуйтесь, разумеется.

wandrien ★★★
()
Ответ на: комментарий от vbr

А я его не собираю.

Хороший аргумент. А нафига тогда опенсорс, если вы все пользуетесь толстыми блобами с неведомой фигней? В архив 5 MB умещалось всё ядро лялекса 2.0. Просто для справки.

bread
()
Ответ на: комментарий от wandrien

Пока никто ещё не ответил чем им ag не угодил. Настаиваю, что греп это для другого, хоть там и рекурсивный поиск прикрутили. Ну не должна такая утилита заниматься поиском файлов, она вообще про файлы не должна знать по хорошему.

bread
()
Ответ на: комментарий от wandrien

А смысл практический в чем?

Грепать логи, да. Берёшь многогигабайтный файл и грепаешь. Нередко надо несколько раз. Ещё и на тормозном сервере. Не часто, но приятно, когда оно работает быстро, а не медленно.

В целом для меня самое главное это нормальные регулярные выражения. Посиксовые меня вымораживают. Но и скорость в разы выше - тоже приятно.

Вот, кстати, со 126 GB результаты, на компьютере у меня 32 GB оперативной памяти, так что кеширование тут не работает:

% head -c 100000000000 /dev/urandom |base64 > data

% time grep -c '[hj]\{3,\}' data
3837313
grep -c '[hj]\{3,\}' data  97.04s user 38.01s system 80% cpu 2:48.00 total

% time grep -c '[hj]\{3,\}' data
3837313
grep -c '[hj]\{3,\}' data  97.13s user 37.95s system 80% cpu 2:47.78 total

% time rg -c '[hj]{3,}' data
3837313
rg -c '[hj]{3,}' data  5.53s user 29.71s system 50% cpu 1:10.10 total

% time rg -c '[hj]{3,}' data
3837313
rg -c '[hj]{3,}' data  5.30s user 21.78s system 43% cpu 1:01.83 total

% time cat data > /dev/null
cat data > /dev/null  0.06s user 10.98s system 19% cpu 55.343 total

Как видно, даже с диском rg работает почти в 3 раза быстрей и практически на пределе скорости диска, в отличие от grep.

vbr ★★★★★
()
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от bread

Пока никто ещё не ответил чем им ag не угодил.

Да потому что:

a61f178 5 years ago
Issues 441 Pull requests 122

dataman ★★★★★
() автор топика
Ответ на: комментарий от bread

А нафига тогда опенсорс, если вы все пользуетесь толстыми блобами с неведомой фигней?

Да кто его знает, нафига. Так устроен наш мир, что в нём победил опенсорс. Лично для меня разницы нет - использовать опенсорс или проприетарщину. У меня куплен WinRAR и я периодически использую его сборку под линукс, никаких негативных эмоций у меня это не вызывает. В исходниках используемого мною ПО я практически никогда не копаюсь.

Я даже крамольную вещь скажу - опенсорс как коммунизм - душит развитие. В нашем мире нет смысла создавать компанию, разрабатывать инновационный grepng, продавать его за деньги. Если есть grep, который пусть и хуже, но бесплатный. Никакой конкуренции. Только её отдельные проявления вроде того же ripgrep, чисто на энтузиазме отдельных людей, без шанса получить денежную компенсацию. Конечно про это ныть смысла нет, мир таков, каков он есть.

В архив 5 MB умещалось всё ядро лялекса 2.0. Просто для справки.

Это 1996 год? В те времена и диски были другого размера. Да и в принципе преклонение перед размером ядра операционной системы я не понимаю, это концептуально очень простая штука. Тут скорей вопрос - как они умудрились его раздуть до сегодняшних размеров.

vbr ★★★★★
()
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от vbr

Я даже крамольную вещь скажу - опенсорс как коммунизм - душит развитие. В нашем мире нет смысла создавать компанию, разрабатывать инновационный grepng, продавать его за деньги.

Душит?

Если за каждый grep платить деньги, то использовать компьютер было бы дорого, использовать для разработки - запредельно дорого.

Инноваций и развития было бы в разы меньше.

Chiffchaff
()
Ответ на: комментарий от Chiffchaff

Душит?

Конечно.

Если за каждый grep платить деньги, то использовать компьютер было бы дорого, использовать для разработки - запредельно дорого.

Посмотри на Intellij Idea. 100 долларов в год. Разве это запредельно дорого? Посмотри на Windows. Там вообще 200 долларов заплатил один раз, и даже обновления бесплатные. С чего ты взял, что это было бы запредельно дорого, я не понимаю.

Весь наш мир основан на капитализме. Каждая гайка стоит денег. А производственный процесс по производству гайки - тем паче. И ничего - в космос вышли. И только программисты пушат в свой гитхаб опенсорс, чтобы их резюме выглядело солидней, иногда побираясь донатами, когда совсем прижмёт.

vbr ★★★★★
()
Последнее исправление: vbr (всего исправлений: 4)
Ответ на: комментарий от vbr

Посмотри на Intellij Idea. 100 долларов в год. Разве это запредельно дорого? Посмотри на Windows. Там вообще 200 долларов заплатил один раз, и даже обновления бесплатные. С чего ты взял, что это было бы запредельно дорого, я не понимаю.

Так я использую в своей работе кучу инструментов. Если за каждый из них платить даже $5, в сумме наберётся внушительная сумма.

Ну и были бы другие последствия, которые мы сейчас не видим. Например, монополия Microsoft, который на рубеже 2000-х достиг почти полной монополии, и там последствия проявлялись в полный рост. Например, дырявый нестандартный браузер IE6, в котором даже баги не фиксились и не было никакого развития годами, более того, даже команду разработчиков браузера разогнали. Потому что зачем тратить деньги, если положение на рынке такое, что у всех один выбор: жри, что дают.

И т.к. при капитализме любая отрасль неизбежно скатывается к олигополии, дуополии, монополии, никаких инноваций бы не было. Монополии вообще незачем ни с кем договариваться - она просто стрижёт купоны ничего не делая. Дуополии и олигополии легко могут сговориться, чтобы делать почти то же самое.

Да и вообще. У меня было в жизни несколько работ, где требовалось работать или разрабатывать в Windows. В гробу я видел, закрытый софт.

Пока у тебя стандартные задачи, всё работает хорошо, ну или ты всегда можешь найти костыль в документации или на форуме.

Если же ты столкнулся хоть с чем-то нестандартным, что не описано в документации, или описано с ошибками, и что достаточно нестандартно, чтобы не быть описанным на юзерских форумах, ты - у разбитого корыта. Ты будешь получать от системы какой-то аналог «500 Internal Error» или синий экран, и в принципе нет никакого способа решения.

У меня есть конкретный кейс, который я не могу расписать из-за NDA. Подожду ещё несколько лет и тогда может быть распишу. В том случае, пришлось дизассемблировать системную DLL Windows, чтобы разобраться, почему возвращалась ошибка. Это был геморрой приблизительно на полгода.

Chiffchaff
()
Ответ на: комментарий от vbr

Бинари find и grep вместе потянут на 500 KB. Вопрос, что растишки напихали в свой rip?

bread
()
Ответ на: комментарий от Chiffchaff

Так я использую в своей работе кучу инструментов. Если за каждый из них платить даже $5, в сумме наберётся внушительная сумма.

То же можно сказать про многих других специалистов. Вон возьми столяра, у него какой-нибудь фуговальный станок может тысячи долларов стоить, а весь набор инструментов легко потянет на десятки тысяч долларов. Причём всё это надо обслуживать, ремонтировать. А тебе $5 жалко.

Ну и были бы другие последствия, которые мы сейчас не видим. Например, монополия Microsoft, который на рубеже 2000-х достиг почти полной монополии, и там последствия проявлялись в полный рост. Например, дырявый нестандартный браузер IE6, в котором даже баги не фиксились и не было никакого развития годами, более того, даже команду разработчиков браузера разогнали. Потому что зачем тратить деньги, если положение на рынке такое, что у всех один выбор: жри, что дают.

Здоровый капиталистический рынок как правило это всё решает естественным путём. На рынке шуруповёртов нет монополии. На рынке автомобилей нет монополии. Может быть антимонопольный комитет должен был работать чуть активней, разбивать микрософт на куски, запрещать им продвигать свои продукты через другие продукты, в Европе что-то подобное было, но как-то вяло.

И т.к. при капитализме любая отрасль неизбежно скатывается к олигополии, дуополии, монополии

Ничего не скатывается. Мне вообще сложно представить, где сейчас монополия. Диваны? Коробки? Телевизоры? Ноутбуки? Сумки? Мультиметры? Смартфоны? Производство печатных плат? Бутылки? Это я просто головой вокруг себя покрутил и не нашёл монополий. Конкуренция это нормальное состояние и она везде.

Да и вообще. У меня было в жизни несколько работ, где требовалось работать или разрабатывать в Windows. В гробу я видел, закрытый софт.

Я тоже работал, разрабатывал в Windows и для Windows. Никаких особых проблем это у меня не вызывало. Мне Windows нравится меньше, чем Linux, как ОС для пользователя (но больше, как ОС для разработки), но в целом это скорей мелочи.

Если же ты столкнулся хоть с чем-то нестандартным, что не описано в документации, или описано с ошибками, и что достаточно нестандартно, чтобы не быть описанным на юзерских форумах, ты - у разбитого корыта. Ты будешь получать от системы какой-то аналог «500 Internal Error» или синий экран, и в принципе нет никакого способа решения.

Какой-то способ решения есть всегда. Вплоть до разработки ядерного модуля, который будет патчить операционную систему в нужном для тебя направлении (но это, конечно, уже прям крайность).

У меня есть конкретный кейс, который я не могу расписать из-за NDA. Подожду ещё несколько лет и тогда может быть распишу. В том случае, пришлось дизассемблировать системную DLL Windows, чтобы разобраться, почему возвращалась ошибка. Это был геморрой приблизительно на полгода.

Это хороший способ получить преимущество и создать уникальный софт, который сложно повторить конкурентам.

vbr ★★★★★
()
Ответ на: комментарий от vbr

Здоровый капиталистический рынок как правило это всё решает естественным путём. На рынке шуруповёртов нет монополии. На рынке автомобилей нет монополии.

Это выдача желаемого за действительное. Весь рынок движется в одном направлении - к монополии. Это неизбежно. Как только кто-то получает хотя бы небольшое преимущество, это позволяет сначала больше вложить в R&D, в рекламу, в демпинг, захватывается ещё большая доля рынка, денег становится ещё больше, можно скупить всех конкурентов, можно купить всех журналистов, можно скупить антимонопольный комитет и всех политиков. В какой-то момент цена выхода на рынок для любого конкурента становится слишком высока.

В каких-то областях это происходит раньше, в каких-то позже, но происходит практически во всех.

Что касается упомянутых автомобилей, например: автоконцерны укрупняются и укрупняются. Какой-то холдинг скупает несколько, и формально мы имеем разные марки, а по сути, всё штампуется на одних и тех же заводах, разнообразие марок искусственно создано.

«Конкуренция» - это проитвоестественное состояние рынка, он стремится к монополии. Единожды получив преимущество, у тебя появляется куча ресурсов, чтобы это преимущество закрепить за собой навсегда.

Chiffchaff
()
Ответ на: комментарий от vbr

Конкуренция это нормальное состояние и она везде.

Это уже очень старая сказка, и давно уже не смешная...

Мне вообще сложно представить, где сейчас монополия

У Трампа, не??.. ;P ;))

Или «пошлины» в сотни процентов — «Это другое!», да? ;))

Somebody ★★★★
()
Ответ на: комментарий от vbr

head -c 100000000000 /dev/urandom |base64 > data

Я взял поменьше:

head -c 1000000000 /dev/urandom | base64 > data
hyperfine -N --export-markdown greps.md  "grep -c '[hj]\{3,\}' data" "rg -c '[hj]{3,}' data" "ug -c '[hj]{3,}' data" "ug -c -P '[hj]{3,}' data" "krep -c -E '[hj]{3,}' data" "pcre2grep -c '[hj]{3,}' data"
CommandMean [ms]Min [ms]Max [ms]Relative
grep -c '[hj]\{3,\}' data21.3 ± 3.816.835.76.19 ± 2.14
rg -c '[hj]{3,}' data302.0 ± 5.8291.6309.387.73 ± 26.18
ug -c '[hj]{3,}' data3.4 ± 1.02.710.61.00
ug -c -P '[hj]{3,}' data3.6 ± 1.02.88.31.04 ± 0.43
krep -c -E '[hj]{3,}' data2944.3 ± 50.22835.43003.3855.29 ± 255.12
pcre2grep -c '[hj]{3,}' data2248.5 ± 13.42230.72275.3653.16 ± 194.55
Summary
  ug -c '[hj]{3,}' data ran
    1.04 ± 0.43 times faster than ug -c -P '[hj]{3,}' data
    6.19 ± 2.14 times faster than grep -c '[hj]\{3,\}' data
   87.73 ± 26.18 times faster than rg -c '[hj]{3,}' data
  653.16 ± 194.55 times faster than pcre2grep -c '[hj]{3,}' data
  855.29 ± 255.12 times faster than krep -c -E '[hj]{3,}' data
dataman ★★★★★
() автор топика
Ответ на: комментарий от dataman

ug

Не сомневался, что такое тоже есть. На yg точно утрем нос дидам.

bread
()
Ответ на: комментарий от dataman

Скорей всего твой hyperfine неправильно работает в случае с grep. Запутался в бэкслэшах. Попробуй grep -Ec '[hj]{3,}'

vbr ★★★★★
()
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от dataman

Для правильного замера как минимум grep и ugrep надо запускать hyperfine с --output=pipe, иначе они почти сразу же завершатся

      --output <WHERE>
          Control where the output of the benchmark is redirected. Note that
          some programs like 'grep' detect when standard output is /dev/null and
          apply certain optimizations. To avoid that, consider using
          '--output=pipe'.
          
          <WHERE> can be:
          
            null:     Redirect output to /dev/null (the default).
          
            pipe:     Feed the output through a pipe before discarding it.
...
doggo
()
Ответ на: комментарий от Sm0ke85

просто grep, ибо есть из коробки и есть надежда что твои скрипты и через 20 лет будут работать верно

Да вот не факт. В Убунте заменили GNU coreutils на uutils и кое-что сломалось. Может в следующий LTS они и не войдут, но рано или поздно их заменят, раз начали.

А раз начали в самом популярном дистрибутиве, значит и другие подтянутся. Кто-то скажет, что вот Редхат-то не станет, но я хочу напомнить, что в RHEL долгое время был upstart..

Нет, идея-то правильная, что в скриптах нужно использовать стандартное, которое везде есть. Просто не стоит на это возлагать большие надежды. Не ломается то, что поддерживают.

MoldAndLimeHoney ★★
()
Ответ на: комментарий от MoldAndLimeHoney

Ничего, скоро скрипты заменим на докер-контейнеры и в 20-летнем скрипте будет окружение 20-летней убунты)

vbr ★★★★★
()
Ответ на: комментарий от doggo

Для правильного замера как минимум grep и ugrep надо запускать hyperfine с --output=pipe

Спасибо!

CommandMean [s]Min [s]Max [s]Relative
grep -Ec '[hj]{3,}' data1.614 ± 0.0071.6021.6295.75 ± 0.07
rg -c '[hj]{3,}' data0.303 ± 0.0040.2970.3091.08 ± 0.02
ug -c '[hj]{3,}' data0.281 ± 0.0030.2750.2861.00
ug -c -P '[hj]{3,}' data1.856 ± 0.0051.8511.8676.61 ± 0.08
krep -c -E '[hj]{3,}' data2.980 ± 0.0462.9143.04410.62 ± 0.21
pcre2grep -c '[hj]{3,}' data2.255 ± 0.0132.2372.2748.04 ± 0.11
Summary
  ug -c '[hj]{3,}' data ran
    1.08 ± 0.02 times faster than rg -c '[hj]{3,}' data
    5.75 ± 0.07 times faster than grep -Ec '[hj]{3,}' data
    6.61 ± 0.08 times faster than ug -c -P '[hj]{3,}' data
    8.04 ± 0.11 times faster than pcre2grep -c '[hj]{3,}' data
   10.62 ± 0.21 times faster than krep -c -E '[hj]{3,}' data
dataman ★★★★★
() автор топика
Ответ на: комментарий от vbr

Кстати я пару лет назад видел скрипт, который работал на старой убунте и не работал на новой. Там была проблема с openssl у которого поменялись некоторые аргументы по умолчанию. Этот скрипт в контейнере и запускали, т.к. разобраться никто не смог, почему не работает (ну или не захотел, я разобрался, конечно).

vbr ★★★★★
()
Ответ на: комментарий от rmammoth

Не люблю rust. Но тул годный. А переписывать его на что-то иное… зачем. Есть ещё ugrep, уже на C++, но что-то его дефолты не сильно зашли. Не получается перейти на него :)

hatred ★★★★
()
Ответ на: комментарий от dataman

rg очень удобную комбинацию зохавали, rg набирать удобнее чем ug… но это моё имхо)

hatred ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.