LINUX.ORG.RU

jq 1.7

 , , ,

jq 1.7

2

2

7 сентября, после пятилетнего застоя, состоялся выпуск 1.7 библиотеки и консольной утилиты jq, предназначенной для работы с форматом JSON и написанной на языке программирования C. Опционально утилита может быть скомпилирована с использованием библиотеки регулярных выражений Oniguruma.

Изменения:

  • новый адрес: https://github.com/jqlang;
  • новые сопровождающие, администраторы и владельцы;
  • файл NEWS заменен на NEWS.md;
  • улучшения CI, документации, тестирования и веб-сайта;
  • образы Docker теперь доступны с https://ghcr.io/jqlang/jq вместо Docker Hub;

Изменения в консольной утилите:

  • цвет ключа объекта можно настраивать с помощью переменной окружения JQ_COLORS;
  • цвет null теперь ярко-черный по умолчанию;
  • для отключения цвета можно использовать переменную окружения NO_COLOR;
  • улучшен вывод с ключом --help: теперь указываются все опции и в более удобном порядке;
  • добавлен ключ --raw-output0 для вывода данных с нулевым байтом в качестве разделителя;
  • удалён ключ --argfile;
  • другие изменения.

Изменения языка запросов:

  • для сохранения точности нужно использовать десятичные литералы чисел. Операции сравнения сохраняют точность, но арифметические операции могут усекаться;
  • добавлена функция pick(stream) для выдачи проекции входного объекта или массива:
$ jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | pick(.a, .b.c, .x)'
{
  "a": 1,
  "b": {
    "c": 2
  },
  "x": null
}
  • добавлена функция debug(msgs), которая работает как debug, но применяет фильтр к входным данным перед записью в stderr:
$ jq -n '1 as $x | 2 | debug("Entering function foo with $x == \($x)", .) | (.+1)'
["DEBUG:","Entering function foo with $x == 1"]
["DEBUG:",2]
3
$ jq -n '{a: 1, b: 2, c: 3} | debug({a, b, sum: (.a+.b)})'
["DEBUG:",{"a":1,"b":2,"sum":3}]
{
  "a": 1,
  "b": 2,
  "c": 3
}
  • добавлена функция scan($re; $flags):
# look for pattern "ab" in "abAB" ignoring casing
$ jq -n '"abAB" | scan("ab"; "i")'
"ab"
"AB"
  • добавлена функция abs для получения абсолютного значения числа;
  • if можно использовать без else:
# convert 1 to "one" otherwise keep as is
$ jq -n '1,2 | if . == 1 then "one" end'
"one"
2
# behaves the same as
$ jq -n '1,2 | if . == 1 then "one" else . end'
"one"
2
# also works with elif
$ jq -n '1,2,3 | if . == 1 then "one" elif . == 2 then "two" end
"one"
"two"
3
  • можно использовать $переменная в качестве ключа в объектных литералах:
$ jq -n '"a" as $key | {$key: 123}'
{
  "a": 123
}
# previously parentheses were needed
$ jq -n '"a" as $key | {($key): 123}'
{
  "a": 123
}
  • можно использовать точку между индексами в цепочке при использовании .["index"]:
$ jq -n '{"a": {"b": 123}} | .a["b"]'
123
# now this also works
$ jq -n '{"a": {"b": 123}} | .a.["b"]'
123
  • можно использовать точку для итератора цепочек значений .[] и .[]?:
$ jq -n '{"a": [123]} | .a[]'
123
# now this also works
$ jq -n '{"a": [123]} | .a.[]'
123
  • ускорение и рефакторинг некоторых встроенных функций;
  • множественные исправления ошибок и другие изменения.

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

★★★★

Проверено: maxcom ()
Последнее исправление: Wizard_ (всего исправлений: 1)

КМК главная проблема языка jq – самобытность и неинтуитивность. Если не использовать его каждую неделю, то всё забывается и каждый раз приходится читать доки заново.

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

Как утилита может быть конкурентом формату?

dataman ★★★★
() автор топика

О ! нормальный инстал, что не может не радовать

git submodule update --init # if building from git to get oniguruma
autoreconf -i               # if building from git
./configure --with-oniguruma=builtin
make -j8
make check
sudo make install
без всратого cmake

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

Я не знаю, может у них в команде появился яркий негр и это дань уважения.

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

Скорее что-то типа консольной утилиты обработки XPath запросов, только для JSON.

DarkAmateur ★★★★
()

А если по делу, то клёвая утилита.

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

Не имел в ним дело, но, посмотрев текст новости, скажу так: мне кажется тут либо «самобытность и неинтуитивность», либо громоздкость и неуклюжесть, как это модно в вебе сейчас (ведь json оттуда).

firkax ★★★★★
()

образы Docker теперь доступны с https://ghcr.io/jqlang/jq вместо Docker Hub;

jq - штука полезная, для отладки всяких rest с json выхлопом.Но нафига ее в docker пихать? Какой тут сакральный смысл?

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

Ещё бы без автотулзов и было бы совсем прекрасно.

Подозреваю что лишь небольшая доработка и его можно будет скомпилить так:

gcc -o jq `find src -name '*.c' -print` -l(...)

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

А что есть вариант лучше? Только сейчас docker стал просто контейнером, так как ПО от docker можно не использовать.

Еще набирает обороты wasm, видимо он будет следующим

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

Ой ну ладно тебе. Его ниша в инфре. Дальше ему вряд ли выйти.

PS паковать jq в докер, это прям дно какое-то))). Давайте тогда уж и awk c grep’ом тоже в контейнеры засунем 😄.

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

и awk c grep’ом тоже в контейнеры засунем

И про true c false не забыть!

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

Это вот как раз тот случай в которую идеально заходят эти ваши LLM нейронки. Ибо тулза полезная, но нужна редко. И все особенности языка забываются. К тому же нужна только для write-only скриптов.

Это как Perl регулярки, но к ним с годами всё равно привыкаешь, потому что они везде и они одинаковые.

a1ba
()

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

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

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

У меня с RegExp так, каждый раз когда нужно(а нужно раз в год, если не реже), уже всё забыл и «изучай» заново.

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

У регулярок же всего 3 базовые операции (sequence, repeat, alternation), остальное сахар. Чего там забывать-то? Хотя различие диалектов подбешивает, конечно.

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

Чего там забывать-то?

Память как у рыбки, я свой то код заново изучать через год начинаю, а тут какая-то фигня из скобочек и спецсимволов.

Loki13 ★★★★★
()

People

dtolnay David Tolnay

а, и в jq этот мерзкий тип пролез. Значит скоро начнут на раст переписывать, форкайте пока не поздно :))

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

автор jaq там мотивацию озвучил

I created jaq originally because I was bothered by jq’s long start-up time, which amounts to about 50ms on my machine

50мс, карл, это вечность. пойду запущу jq, а пока он там стартует кофейку попью :).

ЗЫ опережая аргумент «а если нужно тысячи файлов пропускать через jq» сразу отвечу - значит вам не нужно использовать jq. всему свое место.

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

паковать jq в докер, это прям дно какое-то

Я и не говорил, что мне это нравится.

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

Ради интереса скомпильнул jq, jaq, jql и gojq. :)

CommandMean [ms]Min [ms]Max [ms]Relative
echo '[1, [2], [[3]]]' \| jq 'flatten'2.6 ± 1.01.66.11.22 ± 0.71
echo '[1, [2], [[3]]]' \| jql '..'2.4 ± 1.11.36.41.12 ± 0.70
echo '[1, [2], [[3]]]' \| jaq '..'2.2 ± 1.01.36.91.03 ± 0.66
echo '[1, [2], [[3]]]' \| gojq '..'2.1 ± 0.91.16.21.00
CommandMean [ms]Min [ms]Max [ms]Relative
echo '[1, 2, 3]' \| jq '.[0]'2.4 ± 0.91.56.61.25 ± 0.74
echo '[1, 2, 3]' \| jql '[0]'2.2 ± 1.01.26.51.16 ± 0.75
echo '[1, 2, 3]' \| jaq '[0]'2.2 ± 1.01.36.21.14 ± 0.75
echo '[1, 2, 3]' \| gojq '[0]'1.9 ± 0.91.15.71.00
CommandMean [ms]Min [ms]Max [ms]Relative
echo '{ "foo": "bar" }' \| jq '.foo'2.3 ± 0.91.45.61.22 ± 0.76
echo '{ "foo": "bar" }' \| jql '"foo"'2.2 ± 1.01.26.21.15 ± 0.78
echo '{ "foo": "bar" }' \| jaq '"foo"'2.1 ± 1.01.16.11.08 ± 0.74
echo '{ "foo": "bar" }' \| gojq '"foo"'1.9 ± 0.91.05.61.00
CommandMean [ms]Min [ms]Max [ms]Relative
cat github-repositories.json \| jq -r '[.[] \| {name: .name, url: .url, language: .language, stargazers_count: .stargazers_count, watchers_count: .watchers_count}]' > /dev/null76.6 ± 5.568.5208.54.51 ± 0.83
cat github-repositories.json \| jql '\|>{"name", "url", "language", "stargazers_count", "watchers_count"}' > /dev/null17.0 ± 2.912.526.01.00
dataman ★★★★
() автор топика
Ответ на: комментарий от ergo

Упс, не заметил! Оказывается gojq и jaq не поддерживают |>.

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

Всратее автотулзов ещё надо поискать.

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

И всеравно не понимаю зачем. В моем понимании jq - это такой инструмент отладки чтобы через пайп передать выхлоп, отпарсить и красиво отобразить. А как к нему обращаться внутри docker и (тем более) k8s вообще ума не приложу, усложнения ради усложнений.

firkax intelfx

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

Ну может кто-то хочет украшать и данные по ключам извлекать в промышленных масштабах!

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

Внутри k8s он не нужен. А докер некоторые люди используют вместо Nix, когда нет Nix вместо пакетного менеджера, т. е. тупо вместо того, чтобы сделать apt install jq, пишут docker run --pipe jq и всё.

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

Да, если бы там был jpath, то от этого бы все выиграли, кмк.

ComradeDOS
()

А он научился работать с битым json? Или хотя б пропускать то, что не понял, а не тупо валиться на первой нераспарсенной строке?

Я храню логи апача в json, очень хочется парсить их jq, но эта гадина спотыкается об первый плохо экранированный символ внутри строки и дальше отказывается работать. Последний раз когда проверял, авторы рекомендовали (бгг) исправить json перед обработкой. Да, ща, прям пойду рассказывать разрабам апача, что они плохо кодируют строки

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

Смысл именно сакральный - удовлетворить докерфагов.

Дык эта… jq - это не сферический конь в вакууме. Не знаю как другие, а я в bash-скриптах использую её, аналогом продвинутого grep для json. И вот, получив это чудо в контейнере, куда мне с ним идти и что делать?

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

Не знаю зачем, но может быть полезно. Ладно, запомним.

Полезно.
Я, к примеру, раз в год отчеты некие делаю по CVE. Список уязвимостей для конкретных версий софта удобнее всего (мне) с debian.org брать, а там они в json раздаются. Ну и чтоб не городить парсинг в текст или таблички с последующим поиском и нужной мне сортировкой-фильтрацией, проще сразу по json запросы нужные сочинять.

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

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

firkax ★★★★★
()

утилита хороша. непонятно, зачем к ней прилепили столько всего ненужного. она всего-то парсила json'ы и в этом была вся её суть. для работы с регекспами есть перл и тут ему нет равных. причём нет проблемы использовать перл в связке с jq, если сильно нужно. зачем создавать какой-то странный велосипед с квадратными колёсами?

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