Как использовать команду jq для обработки JSON в Linux
Jq — это мощная и очень гибкая программа синтаксического анализа, которая может передавать и фильтровать данные JSON из файлов и каналов UNIX. Эта статья научит вас основам jq, представит примеры кода, а также некоторые альтернативные реализации, которые вы можете установить уже сегодня.
Для чего используется jq?
Наиболее распространенное использование jq – обработка и управление ответами Contents
Для чего используется jq?
-json-fayl/" title="JSON">JSON от API-интерфейсов программного обеспечения как услуги (SaaS). Например, вы можете использовать jq вместе с cURL, чтобы подключиться к конечным точкам API Digitalocean и получить данные вашей учетной записи.
Кроме того, jq также является мощной утилитой для управления большими файлами JSON. Некоторые из самых популярных сегодня программ баз данных, такие как MongoDB, PostgreSQL и MySQL, поддерживают JSON как способ хранения данных. Таким образом, изучение jq дает вам преимущество в понимании того, как работают эти системы баз данных.
Полезно знать: изучите некоторые из лучших инструментов для достижения редактировать файлы JSON внутри Chrome .
Установка и использование jq
Чтобы начать работу с jq, установите его двоичный пакет в свою систему:
Найдите открытую конечную точку API, на которой вы можете протестировать jq. В моем случае я собираюсь использовать API проверки IP ipinfo.io.
Самый простой фильтр для jq — это фильтр с точкой (.). Это будет ответ довольно распечатать JSON , поскольку jq получил его со стандартного ввода:
curl https://ipinfo.io/ | jq '.'
Еще один базовый фильтр — символ вертикальной черты (|). Это специальный фильтр, который передает выходные данные одного филь
Установка и использование jq
div>
curl https://ipinfo.io/ | jq '. | .ip'
Значение после оператора канала — «Индекс идентификатора объекта». Это ищет во входных данных JSON любую переменную, соответствующую ее тексту, и печатает ее значение на терминале. В данном случае я ищу значение ключа «ip:».
После того, как основы пройдены и очищены, в следующих разделах будут показаны некоторые трюки, которые можно выполнять с помощью jq.
Полезно знать: узнайте, как можно манипулировать текстовыми потоками с помощью sed в Linux .
1. Создание базовой программы чтения каналов с помощью jq
Большинство современных веб-сайтов сегодня предлагают открытые конечные точки API для чтения данных внутри своих платформ. Например, каждый репозиторий Github имеет собственный URL-адрес API, по которому вы можете получать последние коммиты и проблемы для этого проекта.
Вы можете использовать такую конечную точку 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}"
Сохраните файл, затем выполните следующую команду, чтобы сделать его исполняемым:
Протестируйте свою новую программу чтения каналов, разместив последний выпуск в своем любимом репозитории Github:
![Терминал, показывающий работу пользовательского скрипта и печатающий последнюю версию Github.](https://saintist.ru/wp-content/uploads/2024/05/use-jq-json-linux-06-jq-custom-script-working.png)
<
К вашему сведению: узнайте, как создавать собственные RSS-каналы с помощью RSS-Bridge в Linux.
2. Чтение и поиск в базе данных JSON
Помимо чтения данных из API, вы также можете использовать jq для управления файлами JSON на локальном компьютере. Начните с создания простого файла базы данных 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, распечатав первый объект в массиве базы данных:
Сделайте запрос к базе данных JSON, используя фильтр «Индекс идентификатора объекта». В моем случае я ищу значение ключа «.name» для каждой записи в моей базе данных:
jq '.[] | .name' database.json
Вы также можете использовать некоторые встроенные функции jq для фильтрации запросов по определенным качествам. Например, вы можете найти и распечатать все объекты JSON, имеющие значение «.name», содержащее более шести символов:
jq '.[] | select((.name|length)>6)' database.json
Работа с базами данных 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
![](https://saintist.ru/wp-content/uploads/2024/05/use-jq-json-linux-09-conditional-filtering<h2><span id=)
2. Чтение и поиск в базе данных JSONловный оператор в jq, работающий в базе данных.">
Можно временно удалить переменные из базы данных JSON. Это может быть полезно, если вы тестируете свой фильтр и хотите убедиться, что он по-прежнему может обрабатывать ваш набор данных:
jq 'del(.[1].name) | .[]' database.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 '.[0] + .[1]'
Вы можете расширить это расположение массива и построить вокруг него новый код JSON. Например, этот код преобразует текст команды echo в объект JSON через фильтр фигурных скобок:
echo '6 "Mallory" 10' | jq -s '{"id": .[0], "name": .[1], "balance": .[2]}'
Помимо получения необработанных данных, 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 является то, что в настоящее время он недоступен в репозиториях Debian, Ubuntu и Fedora. Единственный способ получить его — либо загрузить Homebrew, либо скомпилировать его из исходного кода.
2. гойк
Годжк — альтернативный парсер JSON, полностью написанный на Go. Он предоставляет доступную и простую в использовании версию jq, которую можно установить практически на любую платформу.
Исходная программа jq может содержать невероятно краткие сообщения об ошибках. В результате отладка jq-скриптов особенно сложна для нового пользователя jq. 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 также использует тот же синтаксис, что и jq, при работе с текстом, что упрощает изучение для всех, кто уже знаком с jq.
Одним из недостатков этой амбициозной цели является то, что fq все еще находится в стадии интенсивной разработки. Таким образом, некоторые функции и поведение программы по-прежнему могут подвергаться радикальным изменениям.
Изучение jq, того, как он работает и что делает его особенным, — это лишь первый шаг к тому, чтобы научиться создавать программы на своем компьютере. Погрузитесь в удивительный мир программирования от чтение основ программирования оболочки .
Изображение предоставлено: Ференц Алмаши через Unsplash . Все изменения и скриншоты Рамсеса Реда.
Альтернативные парсеры JSON для jq
1. жак
2. гойк
3. fq