Когда вы запрашиваете данные через curl или читаете конфигурационный файл, JSON в терминале выглядит примерно так: одна длинная строка без переносов и отступов, которую невозможно читать. А если ответ весит несколько килобайт с вложенными объектами — найти нужное поле глазами нереально.

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

Установка

# macOS
brew install jq

# Ubuntu/Debian
sudo apt-get install jq

# Windows (через Scoop)
scoop install jq

Базовое форматирование

Самый простой случай — просто красиво вывести JSON. Фильтр . означает «вернуть всё как есть»:

curl https://api.example.com/user | jq '.'

Было:

{"id":1,"name":"Иван","address":{"city":"Москва","zip":"101000"}}

Стало:

{
  "id": 1,
  "name": "Иван",
  "address": {
    "city": "Москва",
    "zip": "101000"
  }
}

Извлечение полей

Обращение к полю — через точку:

echo '{"name":"Иван","city":"Москва"}' | jq '.name'
# "Иван"

Вложенные поля:

echo '{"user":{"name":"Иван","age":28}}' | jq '.user.name'
# "Иван"

Работа с массивами

# все элементы массива
echo '[1,2,3]' | jq '.[]'

# элемент по индексу
echo '["a","b","c"]' | jq '.[1]'
# "b"

# длина массива
echo '[1,2,3,4,5]' | jq 'length'
# 5

Попробуйте сами — интерактивный jq

Входной JSON
[ { "id": 1, "name": "Иван", "role": "frontend", "score": 92 }, { "id": 2, "name": "Мария", "role": "backend", "score": 88 }, { "id": 3, "name": "Сергей", "role": "frontend", "score": 75 }, { "id": 4, "name": "Анна", "role": "frontend", "score": 96 } ]
Результат
// выберите фильтр

Фильтрация и преобразование

# оставить только фронтендеров
cat users.json | jq '[.[] | select(.role == "frontend")]'

# извлечь только имена
cat users.json | jq '[.[] | .name]'

# найти максимальный score
cat users.json | jq '[.[] | .score] | max'

В паре с curl

jq идеально работает в конвейере с curl:

# получить только поле token из ответа авторизации
curl -X POST https://api.example.com/auth \
  -d '{"login":"user","password":"pass"}' | jq '.token'

# вывести все id из списка
curl https://api.example.com/posts | jq '[.[] | .id]'

Что запомнить

jq — это grep и sed для JSON. Базовый синтаксис прост: .поле для обращения к ключу, .[] для перебора массива, select() для фильтрации. В связке с curl позволяет быстро вытащить нужное поле из ответа API прямо в терминале.