JSON и jq
Как разбирать JSON в шелле: jq для фильтрации полей, массивов и вывода API без копания глазами.
Почему JSON неудобно грепать
API облаков, kubectl, docker inspect, конфиги — всё отдаёт JSON. Это
вложенная структура, и grep/awk по ней работают плохо: они построчные,
а JSON — дерево. Нужен инструмент, который понимает структуру. Это jq.
jq берёт JSON на вход, применяет выражение и отдаёт результат. Работает в пайпе, как обычная shell-команда.
Достать поле
$ echo '{"name":"web","port":8080}' | jq '.name'
"web"
$ echo '{"name":"web","port":8080}' | jq '.port'
8080
.поле достаёт значение по ключу. Вложенные поля задаются через точку:
.server.host. Чтобы убрать кавычки у строки, есть флаг -r (raw):
$ echo '{"name":"web"}' | jq -r '.name'
web
-r нужен, когда значение идёт в другую команду или переменную: кавычки
там мешают.
Массивы
$ echo '[{"name":"web"},{"name":"db"}]' | jq '.[].name'
"web"
"db"
.[] разворачивает массив в поток элементов, дальше .name берёт поле у
каждого. Достать один элемент по индексу: .[0]. Длину массива даёт length.
Фильтр и формат
jq умеет доставать, фильтровать и переформатировать:
# только запущенные контейнеры, вывести имя и образ
docker inspect $(docker ps -q) \
| jq -r '.[] | select(.State.Running) | "\(.Name) \(.Config.Image)"'
select(условие)— пропускает только подходящие элементы."\(.поле)"— собрать строку из значений (интерполяция).|внутри jq — такой же пайп, но между jq-выражениями.
Где это в работе
jq — стандартный спутник любого CLI, который отдаёт JSON:
kubectl get pods -o json | jq -r '.items[].metadata.name'
curl -s https://api.example.com/users | jq '.[].email'
aws ec2 describe-instances | jq -r '.Reservations[].Instances[].InstanceId'
Без jq это превращается в борьбу с регэкспами. С jq это короткое выражение по структуре.
Что важно запомнить
jq разбирает JSON по структуре, а не построчно: .поле достаёт значение,
.[] разворачивает массив, select() фильтрует.
-r убирает кавычки у строк. Нужен, когда значение идёт в другую команду
или переменную.
jq — спутник любого CLI с JSON-выводом (kubectl -o json, docker inspect, ответы API); он заменяет борьбу с регэкспами коротким выражением.
В следующих треках jq встретится при работе с Kubernetes и облачными API.
Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс