ГлавнаяОперационные системыLinuxКак использовать команду jq для обработки JSON в Linux

Как использовать команду jq для обработки JSON в Linux

Jq — это мощная и очень гибкая программа синтаксического анализа, которая может передавать и фильтровать данные JSON из файлов и каналов UNIX. Эта статья научит вас основам jq, представит примеры кода, а также некоторые альтернативные реализации, которые вы можете установить уже сегодня.

Для чего используется jq?

Наиболее распространенное использование jq  – обработка и управление ответами

Contents

Для чего используется jq?

-json-fayl/" title="JSON">JSON от API-интерфейсов программного обеспечения как услуги (SaaS). Например, вы можете использовать jq вместе с cURL, чтобы подключиться к конечным точкам API Digitalocean и получить данные вашей учетной записи.

Терминал, показывающий пример доступа API Digitalocean к jq.

Кроме того, jq также является мощной утилитой для управления большими файлами JSON. Некоторые из самых популярных сегодня программ баз данных, такие как MongoDB, PostgreSQL и MySQL, поддерживают JSON как способ хранения данных. Таким образом, изучение jq дает вам преимущество в понимании того, как работают эти системы баз данных.

Полезно знать: изучите некоторые из лучших инструментов для достижения редактировать файлы JSON внутри Chrome .

Установка и использование jq

Чтобы начать работу с jq, установите его двоичный пакет в свою систему:

sudo apt install jq

Найдите открытую конечную точку API, на которой вы можете протестировать jq. В моем случае я собираюсь использовать API проверки IP ipinfo.io.

Используйте веб-сайт Jq Json Linux 02 Ipinfo Saas

Самый простой фильтр для jq — это фильтр с точкой (.). Это будет ответ довольно распечатать JSON , поскольку jq получил его со стандартного ввода:

curl https://ipinfo.io/ | jq '.'

Еще один базовый фильтр — символ вертикальной черты (|). Это специальный фильтр, который передает выходные данные одного филь

Установка и использование jq

div>
curl https://ipinfo.io/ | jq '. | .ip'

Значение после оператора канала — «Индекс идентификатора объекта». Это ищет во входных данных JSON любую переменную, соответствующую ее тексту, и печатает ее значение на терминале. В данном случае я ищу значение ключа «ip:».

Терминал, показывающий отфильтрованный вывод ipinfo SaaS API через jq.

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

Полезно знать: узнайте, как можно манипулировать текстовыми потоками с помощью sed в Linux .

1. Создание базовой программы чтения каналов с помощью jq

Большинство современных веб-сайтов сегодня предлагают открытые конечные точки API для чтения данных внутри своих платформ. Например, каждый репозиторий Github имеет собственный URL-адрес API, по которому вы можете получать последние коммиты и проблемы для этого проекта.

Терминал, показывающий «стену кода» по умолчанию для API Github.

Вы можете использовать такую ​​конечную точку API с jq, чтобы создать свой собственный простой канал в стиле RSS. Для начала используйте cURL, чтобы проверить, правильно ли работает конечная точка:

curl https://api.github.com/repos/bitcoin/bitcoin/issues

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

curl https://api.github.com/repos/bitcoin/bitcoin/issues | jq '.[0]'

Это покажет различные поля, которые API Github отправляет в jq. Вы можете использовать их для создания собственного объекта JSON, передав входные данные в фильтр фигурных скобок ({}):

curl https://api.github.com/repos/bitcoin/bitcoin/issues | jq '.[0] | { title: .title }'

Добавление фильтра запятой (,) внутри фигурных скобок позволяет добавить несколько полей в ваш пользовательский объект:

curl https://api.github.com/repos/bitcoin/bitcoin/issues | jq '.[0] | {title: .title, url: .html_url, author: .user.login}'
1. Создание базовой программы чтения каналов с помощью jqson-linux-05-custom-json-object.png" alt="Терминал, показывающий пользовательский очищенный объект JSON из API Github.">

Удаление «0» внутри квадратных скобок приведет к применению фильтра jq ко всему каналу:

curl https://api.github.com/repos/bitcoin/bitcoin/issues | jq '.[] | {title: .title, url: .html_url, author: .user.login}'

Вы также можете создать небольшой скрипт Bash для отображения последних проблем из вашего любимого проекта Github. Вставьте следующий блок кода в пустой файл сценария оболочки:

#!/bin/bash<br><br># usage: ./script.sh [0 ... 29]<br><br>REPO="https://api.github.com/repos/bitcoin/bitcoin/issues"<br><br>curl $REPO | jq ".[$1] | {title: .title, url: .html_url, author: .user.login}"

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

chmod u+x ./script.sh

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

./script.sh 0
Терминал, показывающий работу пользовательского скрипта и печатающий последнюю версию Github.<

К вашему сведению: узнайте, как создавать собственные RSS-каналы с помощью RSS-Bridge в Linux.

2. Чтение и поиск в базе данных JSON

Помимо чтения данных из API, вы также можете использовать jq для управления файлами JSON на локальном компьютере. Начните с создания простого файла базы данных JSON с помощью вашего любимого текстового редактора:

nano ./database.json

Вставьте следующий блок данных в файл и сохраните его:

[<br>    {"id": 1, "name": "Ramces", "balance": 20},<br>    {"id": 2, "name": "Alice", "balance": 30},<br>    {"id": 3, "name": "Bob", "balance": 10},<br>    {"id": 4, "name": "Charlie", "balance": 20},<br>    {"id": 5, "name": "Maria", "balance": 50}<br>]

Проверьте, правильно ли jq читает ваш файл JSON, распечатав первый объект в массиве базы данных:

jq '.[0]' database.json
Терминал, показывающий, как jq печатает первую запись в базе данных JSON.

Сделайте запрос к базе данных JSON, используя фильтр «Индекс идентификатора объекта». В моем случае я ищу значение ключа «.name» для каждой записи в моей базе данных:

jq '.[] | .name' database.json

Вы также можете использовать некоторые встроенные функции jq для фильтрации запросов по определенным качествам. Например, вы можете найти и распечатать все объекты JSON, имеющие значение «.name», содержащее более шести символов:

jq '.[] | select((.name|length)>6)' database.json
Терминал, показывающий вывод jq с ограничением длины имени.

Работа с базами данных JSON с помощью jq

Кроме того, jq может работать с базами данных JSON аналогично простой электронной таблице. Например, следующая команда выводит общую сумму ключа «.balance» для каждого объекта в базе данных:

jq '[.[] | .balance] | add' database.json

Вы даже можете расширить это, добавив в запрос условный оператор. Следующий пример добавит «.balance» только в том случае, если значение «.name» второго объекта — «Алиса»:

jq 'if .[1].name == "Alice" then [ .[] | .balance ] | add else "Second name is not Alice" end' database.json
2. Чтение и поиск в базе данных JSONловный оператор в jq, работающий в базе данных.">

Можно временно удалить переменные из базы данных JSON. Это может быть полезно, если вы тестируете свой фильтр и хотите убедиться, что он по-прежнему может обрабатывать ваш набор данных:

jq 'del(.[1].name) | .[]' database.json
Терминал, показывающий вторую запись без ключа JSON без имени.

Вы также можете вставлять новые переменные в базу данных с помощью оператора «+». Например, следующая строка добавляет переменную «active: true» к первому объекту в базе данных:

jq '.[0] + {active: true}' database.json
Терминал, показывающий дополнительное значение ключа в первой записи базы данных.

Примечание. Вы можете сделать свои изменения постоянными, передав вывод команды jq в исходный файл базы данных: jq '.[0] + {active: true}' database.json > database.json.

3. Преобразование данных, отличных от JSON, в jq

Еще одна замечательная особенность jq заключается в том, что он может принимать и работать с данными, отличными от JSON. Для этого программа использует альтернативный «режим Slurp», в котором любые данные, разделенные пробелами и символами новой строки, преобразуются в массив JSON.

Вы можете включить эту функцию, передав данные в jq с флагом -s:

echo '1 2' | jq -s .
Терминал, показывающий текстовую строку, преобразованную в массив JSON.

Одним из преимуществ преобразования необработанных данных в массив является то, что к ним можно обращаться с помощью индексных номеров массива. Следующая команда добавляет два значения, ссылаясь на их расположение в преобразованном массиве:

echo '1 2' | jq -s '.[0] + .[1]'

Вы можете расширить это расположение массива и построить вокруг него новый код JSON. Например, этот код преобразует текст команды echo в объект JSON через фильтр фигурных скобок:

echo '6 "Mallory" 10' | jq -s '{"id": .[0], "name": .[1], "balance": .[2]}'
Терминал, показывающий пользовательский объект JSON в формате образца базы данных.

Помимо получения необработанных данных, jq также может возвращать в качестве выходных данных данные, отличные от JSON. Это полезно, если вы используете jq как часть более крупного сценария оболочки и вам нужен только результат его фильтров.

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

jq -r '.[] | .name' database.json
Терминал, показывающий список имен из базы данных без форматирования.

Альтернативные парсеры JSON для jq

Поскольку код jq имеет открытый исходный код, различные разработчики создали свои собственные версии анализатора JSON. У каждого из них есть свое уникальное преимущество, которое либо улучшает, либо меняет основную часть jq.

1. жак

Жак  — мощный анализатор JSON, предоставляющий практически идентичный набор функций jq.

Написанный на Rust, Jaq является одним из главных преимуществ Jaq в том, что он может запускать язык jq до 30 раз быстрее, чем исходный парсер, сохраняя при этом обратную совместимость. Уже одно это делает его ценным, когда вы используете большие фильтры jq и хотите максимизировать производительность вашего компьютера.

Терминал, показывающий работу jaq в моем образце базы данных.

Тем не менее, одним из недостатков jaq является то, что в настоящее время он недоступен в репозиториях Debian, Ubuntu и Fedora. Единственный способ получить его — либо загрузить Homebrew, либо скомпилировать его из исходного кода.

2. гойк

Годжк — альтернативный парсер JSON, полностью написанный на Go. Он предоставляет доступную и простую в использовании версию jq, которую можно установить практически на любую платформу.

Исходная программа jq может содержать невероятно краткие сообщения об ошибках. В результате отладка jq-скриптов особенно сложна для нового пользователя jq. Gojq решает эту проблему, показывая вам, где находится ошибка в вашем скрипте, а также предоставляя подробные сообщения о типе произошедшей ошибки.

Терминал, показывающий образец базы данных, считанный для gojq.

Еще одним достоинством gojq является то, что он может читать и обрабатывать файлы JSON и YAML. Это может быть особенно полезно, если вы являетесь пользователем Docker и Docker Compose и хотите автоматизировать рабочий процесс развертывания.

Самая большая проблема Gojq заключается в том, что он удалил некоторые функции, которые были включены по умолчанию в исх

3. Преобразование данных, отличных от JSON, в jq

scii-output, --seqи --sort-keys, не существуют на gojq.

К вашему сведению: узнайте, как улучшить свой код JSON, используя некоторые из лучшие средства украшения JSON сегодня .

3. fq

В отличие от jaq и gojq, fq представляет собой комплексный набор программных инструментов, который может анализировать как текстовые, так и двоичные данные. Он может работать с различными популярными форматами, такими как JSON, YAML, HTML и даже FLAC.

Терминал, показывающий, как fq читает образец файла базы данных.

Самой большой особенностью fq является то, что он содержит встроенную программу чтения файлов в шестнадцатеричном формате. Это упрощает просмотр внутренней структуры файла, чтобы определить, как он создан и есть ли в нем что-то не так. Помимо этого, fq также использует тот же синтаксис, что и jq, при работе с текстом, что упрощает изучение для всех, кто уже знаком с jq.

Одним из недостатков этой амбициозной цели является то, что fq все еще находится в стадии интенсивной разработки. Таким образом, некоторые функции и поведение программы по-прежнему могут подвергаться радикальным изменениям.

Изучение jq, того, как он работает и что делает его особенным, — это лишь первый шаг к тому, чтобы научиться создавать программы на своем компьютере. Погрузитесь в удивительный мир программирования от чтение основ программирования оболочки .

Изображение предоставлено: Ференц Алмаши через Unsplash . Все изменения и скриншоты Рамсеса Реда.

Альтернативные парсеры JSON для jq

1. жак

2. гойк

3. fq

ПОХОЖИЕ СТАТЬИ

Популярные записи