Работайте с JSON в BASH, используя jq

Инструмент jqкомандной строки — это легкий и гибкий процессор JSON командной строки . Он отлично подходит для анализа вывода JSON в BASH.

Одна из замечательных особенностей заключается jqв том, что он написан на переносимом языке C и не имеет никаких зависимостей во время выполнения. Все, что вам нужно сделать, это загрузить один двоичный файл или использовать менеджер пакетов, например apt, и установить его с помощью одной команды.

Планирование сценария

Для демонстрации в этом уроке я бы использовал внешний REST API, который возвращает простой вывод JSON, называемый QuizAPI :

https://quizapi.io/

Если вы хотите следовать инструкциям, обязательно получите бесплатный ключ API здесь:

https://quizapi.io/clientarea/settings/token

QuizAPI бесплатен для разработчиков.

Установка jq

Существует множество способов установки jqв вашу систему. Один из наиболее простых способов сделать это — использовать менеджер пакетов в зависимости от вашей ОС.

Вот список команд, которые вам нужно будет использовать в зависимости от вашей ОС:

  • Установите jq в Ubuntu/Debian:

sudo apt-get install jq
  • Установите jq в Fedora:

sudo dnf install jq
  • Установите jq на openSUSE:

sudo zypper install jq
  • Установите jq на Arch:

sudo pacman -S jq
  • Установка на Mac с помощью Homebrew:

brew install jq
  • Установите на Mac с помощью MacPort:

port install jq

Если вы используете другую ОС, я бы рекомендовал просмотреть официальную документацию здесь для получения дополнительной информации:

https://stedolan.github.io/jq/download/

После установки jq вы можете проверить текущую версию, выполнив следующую команду:

jq --version

Разбор JSON с помощью jq

После jqустановки ключа API QuizAPI вы можете анализировать выходные данные QuizAPI в формате JSON непосредственно в своем терминале.

Сначала создайте переменную, в которой будет храниться ваш ключ API:

API_KEY=YOUR_API_KEY_HERE

Чтобы получить выходные данные от одной из конечных точек QuizAPI, вы можете использовать команду Curl:

curl "https://quizapi.io/api/v1/questions?apiKey=${API_KEY}&limit=10"

Для более конкретного вывода вы можете использовать генератор URL-адресов QuizAPI здесь:

https://quizapi.io/api-config

После запуска команды curl результат, который вы получите, будет выглядеть следующим образом:

Это может быть довольно сложно прочитать, но благодаря инструменту командной строки jq все, что нам нужно сделать, это передать команду Curl в jq, и мы увидим хороший форматированный вывод JSON:

curl "https://quizapi.io/api/v1/questions?apiKey=${API_KEY}&limit=10" | jq

Обратите внимание на | jqв конце.

В этом случае результат, который вы получите, будет выглядеть примерно так:

Теперь это выглядит намного красивее! Инструмент командной строки jq отформатировал вывод и добавил красивую раскраску!

Получение первого элемента с помощью jq

Допустим, мы хотели получить только первый элемент из вывода JSON, для этого нам нужно просто указать индекс, который мы хотим видеть, с помощью следующего синтаксиса:

jq .[0]

Теперь, если мы снова запустим команду curl и направим вывод в jq .[0] следующим образом:

curl "https://quizapi.io/api/v1/questions?apiKey=${API_KEY}&limit=10" | jq.[0]

Вы получите только первый элемент, и результат будет выглядеть следующим образом:

Получение значения только для определенного ключа

Иногда вам может потребоваться получить только значение определенного ключа, скажем, в нашем примере QuizAPI возвращает список вопросов вместе с ответами, описанием и т. д., но что, если вы хотите получить только вопросы без дополнительной информации? ?

Это будет довольно просто с jq, все, что вам нужно сделать, это добавить ключ после команды jq, чтобы это выглядело примерно так:

jq .[].question

Нам нужно добавить, .[]поскольку QuizAPI возвращает массив, и, указав его, .[]мы сообщаем jq, что хотим получить значение .question для всех элементов массива.

Результат, который вы получите, будет выглядеть так:

Как видите, теперь мы получаем только вопросы без остальных значений.

Использование jq в сценарии BASH

Давайте продолжим и создадим небольшой bash-скрипт, который должен выводить нам следующую информацию:

  • Получить только первый вопрос из вывода

  • Получите все ответы на этот вопрос

  • Присвойте ответы переменным

  • Распечатать вопрос и ответы

  • Для этого я собрал следующий скрипт:

{notice} обязательно замените часть API_KEY своим фактическим ключом QuizAPI:

#!/bin/bash

##
# Make an API call to QuizAPI and store the output in a variable
##
output=$(curl 'https://quizapi.io/api/v1/questions?apiKey=API_KEY&limit=10' 2>/dev/null)

##
# Get only the first question
##
output=$(echo $output | jq .[0])

##
# Get the question
##
question=$(echo $output | jq .question)

##
# Get the answers
##

answer_a=$(echo $output | jq .answers.answer_a)
answer_b=$(echo $output | jq .answers.answer_b)
answer_c=$(echo $output | jq .answers.answer_c)
answer_d=$(echo $output | jq .answers.answer_d)

##
# Output the question
##

echo "
Question: ${question}

A) ${answer_a}
B) ${answer_b}
C) ${answer_c}
D) ${answer_d}

"

Если вы запустите скрипт, вы получите следующий результат:

Мы можем пойти еще дальше, сделав это интерактивным, чтобы мы могли выбирать ответ прямо в нашем терминале.

Уже существует скрипт bash, который делает это с помощью QuizAPI и jq:

Вы можете посмотреть этот скрипт здесь:

Заключение

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

Таким образом, вы можете легко взаимодействовать со всеми видами REST API с помощью BASH.

Для получения дополнительной информации вы можете взглянуть на официальную документацию здесь:

Для получения дополнительной информации о QuizAPI вы можете просмотреть официальную документацию здесь:

Last updated