jq — это консольная утилита, которая делает работу с JSON удобной. Вместо того чтобы мучительно выискивать данные с помощью `grep` и `sed`, вы пишете короткие выражения (фильтры), а jq их выполняет: ищет, вырезает, преобразует и форматирует.
[Установка]
Проще всего поставить jq через пакетный менеджер вашей системы:
Ваша система
Команда для установки
macOS
brew install jq
Ubuntu / Debian
sudo apt-get install jq
CentOS / RHEL / Fedora
sudo yum install jq
Windows
choco install jq (через Chocolatey)
[Кирпичики: основные фильтры]
Язык запросов jq строится из фильтров, которые можно комбинировать через конвейер (`|`) — точно как в bash.
Самый частый сценарий: вы получаете от API огромный JSON-ответ, и вам нужно вытащить одно-два нужных значения.
1. Красивый вывод (`'.'`). Превращает минифицированный JSON в читаемый:
jq это утилита командной строки, которая на входе принимает текст JSON, применяет е нему указанный фильтр и на выходе генерирует JSON.
Простейший фильтр это точка ., который копирует вход jq на выход без модификации, кроме форматирования. Более продвинутые фильры см. jq(1) manpage ("man jq") и/или https://jqlang.github.io/jq/.
Пример использования:
$ echo '{"foo": 0}' | jq . { "foo": 0 }
Опции командной строки:
-n, --null-input используется `null` в качестве одиночного входного значения;
-R, --raw-input читает каждую линию как строку вместо JSON;
-s, --slurp читает весь ввод в массив, и использует его как одиночное
входное значение;
-c, --compact-output компактный вывод вместо красивого (pretty-printed;
-r, --raw-output выведет строки без esc-ов и кавычек;
--raw-output0 применит -r и выведет NUL после каждого вывода;
-j, --join-output применит -r и выведет без символа \n после каждого вывода;
-a, --ascii-output выведет строки только символами ASCII, используя
esc-последовательности;
-S, --sort-keys сортирует ключи каждого объекта на выводе;
-C, --color-output раскрашивает вывод JSON;
-M, --monochrome-output запретит расцвеченный вывод;
--tab использует табы для отступа;
--indent n использует n пробелов для отступа (максимум 7 пробелов);
--unbuffered сбрасывает (flush) выходной поток после каждого вывода;
--stream анализирует входное значение в потоковом режиме;
--stream-errors применит --stream и сообщит об ошибке парсинга в виде массива;
--seq парсит ввод/вывод как application/json-seq;
-f, --from-file file загрузит фильтр из файла;
-L directory ищет модули из директории;
--arg name value установит $name в значение строки;
--argjson name value установит $name в значение JSON;
--slurpfile name file установит $name в массив значений JSON, прочитанных из файла;
--rawfile name file установит $name в строку содержимого файла;
--args будет использовать остальные аргументы как позиционные
строковые значения;
--jsonargs будет использовать остальные аргументы как позиционные
JSON-значения;
-e, --exit-status установит код статуса завершения на основе вывода;
-V, --version покажет версию;
--build-configuration покажет конфигурацию сборки jq;
-h, --help покажет подсказку;
-- завершит обработку аргументов;
Именованные аргументы также доступны как $ARGS.named[], в то время как позиционные аргументы доступны как $ARGS.positional[].
[Альтернатива: утилита fx]
Это open-source утилита [3], которая претендует на конкуренцию для jq. Хороший обзор этой утилиты от автора см. на Хабре [1]. Саму свежую информацию см. по ссылкам [2, 3].