Software Lifehack

jq: чтение и фильтрация JSON в терминале

API вернул простыню JSON в одну строку. jq форматирует, фильтрует и достаёт нужные поля — базовый набор команд для повседневной работы.

Проверено: jq 1.7, Ubuntu 24.04
jq: чтение и фильтрация JSON в терминале

Разбирать 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 и логами.