Работайте с JSON в BASH, используя jq
Инструмент jq
командной строки — это легкий и гибкий процессор JSON командной строки . Он отлично подходит для анализа вывода JSON в BASH.
Одна из замечательных особенностей заключается jq
в том, что он написан на переносимом языке C и не имеет никаких зависимостей во время выполнения. Все, что вам нужно сделать, это загрузить один двоичный файл или использовать менеджер пакетов, например apt, и установить его с помощью одной команды.
Планирование сценария
Для демонстрации в этом уроке я бы использовал внешний REST API, который возвращает простой вывод JSON, называемый QuizAPI :
Если вы хотите следовать инструкциям, обязательно получите бесплатный ключ API здесь:
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
Если вы используете другую ОС, я бы рекомендовал просмотреть официальную документацию здесь для получения дополнительной информации:
После установки 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 здесь:
После запуска команды 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