TGViewer
Инструменты программиста Инструменты программиста @prog_tools · 12.9K subscribers
Post #2747 2.06K

Forwarded from DevOps для ДевоПсов

jsongrep — быстрее чем jq, jmespath, jsonpath-rust и jql?

Студент вдохновился историей рипгрепа и сделал инструмент для поиска значений в JSON-документах. Концептуально он делает то же, что и grep для текста: скармливаете JSON, даёте паттерн, получаете все значения, пути к которым попадают под этот паттерн («достань мне все поля error из логов за сегодня»).

Язык запросов выглядит как смесь JSONPath и регулярных выражений. Если вы когда-нибудь писали регулярки для путей в файловой системе или URL, то тут всё очень похоже, только вместо символов у вас ключи и индексы.

Зачем это нужно

Если вы работаете с большими JSON-файлами, то рано или поздно сталкиваетесь с задачей «достань мне все значения по такому-то пути». jq для этого подходит, но он тяжеловесный: это полноценный язык трансформации, интерпретатор, который на каждом шаге оценивает выражения, проверяет условия, рекурсивно обходит дерево. Для простого поиска это оверкилл.

jsongrep сознательно ограничен: он не умеет трансформировать данные, нет арифметики, нет фильтров, нет строковой интерполяции. Зато за счёт этого он работает на порядок быстрее на больших документах, что подтверждают бенчмарки автора: на 190-мегабайтном GeoJSON файле он обходит jq в end-to-end тестах с внушительным отрывом.

Кейсы применения

— Анализ логов в JSON-формате. jsongrep с флагом -F делает рекурсивный поиск поля на любой глубине одной командой.

— Работа с API-ответами. curl + jsongrep быстрее, чем открывать Postman или писать jq-ванлайнер для простой выборки.

— GeoJSON и прочие большие структурированные файлы. Например для городских служб, геодезистов, GIS-специалистов, которым нужно быстро извлекать данные из таких файлов без загрузки всего документа в память.

Почему так быстро

Автор учил теорию автоматов, технические детали можно почитать в статье. Если упростить, нет никаких if-else цепочек, нет рекурсивного спуска с проверкой условий на каждом узле. Неподходящая ветка дерева отсекается за O(1) — просто нет перехода в таблице.

Есть и цена за эту скорость: компиляция запроса в DFA занимает время. На маленьких документах jq может оказаться быстрее просто потому, что не тратит время на построение автомата. Но на документах от мегабайта и выше jsongrep начинает выигрывать.

Инструмент новый, студенческий, в бою ещё не протестирован, но как минимум ставим лайк за научный подход.

https://github.com/micahkepe/jsongrep
  • ❤ 3
  • 👍 2
More from @prog_tools
  1. Sep 30, 2026Как найти источник расхода памяти в живом Python-процессе с Memray Memray подключается к з…
  2. Sep 29, 2026Как фильтровать JSON в терминале с jq jq — утилита командной строки для фильтрации и преоб…
  3. Sep 29, 2026Delta и fzf: Git-диффы с посимвольной подсветкой и меню файлов Delta оформляет вывод git d…
  4. Sep 28, 2026Nebula ArchRules: общие архитектурные проверки для JVM-проектов Nebula ArchRules переносит…
  5. Sep 28, 2026Как сохранить работу при обрыве SSH с помощью tmux tmux сохраняет терминальную сессию на с…
  6. Sep 27, 2026Как проверить чужую ветку через Git worktree Git worktree создаёт для ветки отдельный рабо…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →