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 — это повседневная задача.