Gymterview
middle

Как работать с JSON в командной строке с помощью jq?

jq — специализированный инструмент командной строки для парсинга, фильтрации и трансформации JSON. Незаменим при работе с REST API, конфигурациями, логами в JSON-формате и выводом инструментов DevOps (Docker, Kubernetes, Terraform).

Базовое использование

Пример
# Красивый вывод (pretty print)
echo '{"name":"John","age":30}' | jq .

# Из файла
jq . config.json

# Из curl
curl -s https://api.example.com/users | jq .

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

Пример
echo '{"name":"John","age":30}' | jq '.name'
# "John"

# Без кавычек (raw output)
echo '{"name":"John","age":30}' | jq -r '.name'
# John

# Вложенные объекты
echo '{"user":{"name":"John","address":{"city":"Moscow"}}}' | jq '.user.address.city'
# "Moscow"

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

Пример
echo '[1,2,3,4,5]' | jq '.[0]'           # Первый элемент: 1
echo '[1,2,3,4,5]' | jq '.[-1]'          # Последний элемент: 5
echo '[1,2,3,4,5]' | jq '.[2:4]'         # Срез: [3,4]
echo '[1,2,3,4,5]' | jq '.[]'            # Все элементы по одному
echo '[1,2,3,4,5]' | jq 'length'         # Длина: 5

# Извлечение поля из объектов массива
echo '[{"name":"John"},{"name":"Jane"}]' | jq '.[].name'
# "John"
# "Jane"

# Результат в виде массива
echo '[{"name":"John"},{"name":"Jane"}]' | jq '[.[].name]'
# ["John","Jane"]

Фильтрация с select

Пример
# select — фильтр по условию
echo '[{"name":"John","age":30},{"name":"Jane","age":25}]' | \
    jq '.[] | select(.age > 28)'
# {"name":"John","age":30}

# Множественные условия
echo '[{"name":"John","active":true},{"name":"Jane","active":false}]' | \
    jq '.[] | select(.active == true) | .name'
# "John"

Трансформация

Пример
# Создание нового объекта
echo '{"first":"John","last":"Doe","age":30}' | \
    jq '{fullName: (.first + " " + .last), age}'
# {"fullName":"John Doe","age":30}

# map — применить преобразование к каждому элементу
echo '[1,2,3,4,5]' | jq 'map(. * 2)'
# [2,4,6,8,10]

# Сортировка
echo '[{"name":"Charlie"},{"name":"Alice"},{"name":"Bob"}]' | jq 'sort_by(.name)'

# Группировка
echo '[{"type":"A","val":1},{"type":"B","val":2},{"type":"A","val":3}]' | \
    jq 'group_by(.type)'

Практические примеры

Пример
# Парсинг ответа Spring Boot Actuator
curl -s http://localhost:8080/actuator/health | jq '.status'

# Извлечь все имена из ответа API
curl -s https://api.example.com/users | jq -r '.[].name'

# Парсинг docker inspect
docker inspect container_name | jq '.[0].NetworkSettings.IPAddress'

# Парсинг Kubernetes — найти незапущенные поды
kubectl get pods -o json | \
    jq -r '.items[] | select(.status.phase != "Running") | .metadata.name'

# Преобразовать JSON в CSV
echo '[{"name":"John","age":30},{"name":"Jane","age":25}]' | \
    jq -r '.[] | [.name, .age] | @csv'
# "John",30
# "Jane",25

# Подсчитать элементы по условию
curl -s https://api.example.com/issues | \
    jq '[.[] | select(.status == "open")] | length'

Краткая шпаргалка по синтаксису jq

Выражение Описание
. Весь объект
.field Значение поля
.field1.field2 Вложенное поле
.[N] Элемент массива по индексу
.[] Все элементы массива
| select(cond) Фильтрация по условию
map(expr) Преобразование каждого элемента
sort_by(.field) Сортировка
group_by(.field) Группировка
length Длина массива/строки
keys Ключи объекта
-r (флаг) Raw output (без кавычек)

На собеседовании: jq — инструмент Middle/Senior уровня. Достаточно знать базовые операции: извлечение полей (.field), итерация по массивам (.[]), фильтрация (select). Покажите практику: «curl … | jq ‘.status’» для проверки health endpoint — это повседневная задача.