Разбирать JSON через grep — путь в никуда. jq понимает структуру и достаёт данные по пути, а не по совпадению текста.
Установка
sudo apt install -y jq
Форматирование
Самое частое применение — сделать нечитаемый ответ читаемым:
curl -s https://api.example.com/data | jq .
Точка означает «весь документ без изменений». jq добавит отступы и подсветку.
Компактный вывод обратно в одну строку:
jq -c . file.json
Извлечение полей
Один ключ:
jq '.name' file.json
Вложенный путь:
jq '.server.config.port' file.json
Без кавычек вокруг строки — удобно для подстановки в скрипты:
jq -r '.name' file.json
Ключ -r (raw output) — тот, который нужен почти всегда при работе в bash.
Массивы
Элемент по индексу:
jq '.items[0]' file.json
Все элементы:
jq '.items[]' file.json
Одно поле из каждого элемента:
jq -r '.items[].name' file.json
Количество:
jq '.items | length' file.json
Фильтрация
Только элементы, удовлетворяющие условию:
jq '.items[] | select(.status == "active")' file.json
Числовое сравнение:
jq '.items[] | select(.size > 1000)' file.json
Несколько условий:
jq '.items[] | select(.status == "active" and .size > 1000)' file.json
Сборка своего объекта
Оставить только нужные поля:
jq '.items[] | {name, port}' file.json
С переименованием:
jq '.items[] | {имя: .name, порт: .server.port}' file.json
Вывод в виде таблицы:
jq -r '.items[] | [.name, .status, .size] | @tsv' file.json | column -t
Практические примеры
Список контейнеров Docker с их состоянием:
docker inspect $(docker ps -q) | \
jq -r '.[] | [.Name, .State.Status, .Config.Image] | @tsv' | column -t
Разбор systemd-журнала в формате JSON:
journalctl -u nginx -o json --since "1 hour ago" | \
jq -r 'select(.PRIORITY <= "3") | .MESSAGE'
Проверка ключа в ответе API:
curl -s https://api.example.com/health | jq -e '.status == "ok"' > /dev/null && echo OK || echo FAIL
Ключ -e задаёт код возврата по результату выражения — так jq встраивается в скрипты и мониторинг.
Совет. Не помните синтаксис — отлаживайте выражение на jqplay.org или локально, добавляя по одному фильтру через | и глядя на промежуточный результат.
Итог
Минимум для старта: jq . для форматирования, jq -r '.путь' для извлечения, select() для фильтрации и @tsv с column -t для таблиц. Этого хватает для большинства задач с API и логами.