Разбор и красивая печать JSON с использованием Jq в Linux
Разобрать и красиво распечатать JSON
JSON — это легкий и независимый от языка формат хранения данных, который легко интегрируется с большинством языков программирования, а также понятен людям, конечно, при правильном форматировании. Слово JSON означает JavaSscript Object Notation, хотя оно начинается с JavaScript и в первую очередь используется для обмена данными между сервером и браузером, но теперь используется во многих областях, включая встроенные системы. Здесь мы собираемся разобрать и красиво распечатать JSON с помощью инструментов командной строки в Linux. Это чрезвычайно полезно для обработки больших данных JSON в сценариях оболочки или для управления данными JSON в сценариях оболочки.
Что такое красивая печать?
Данные JSON структурированы так, чтобы их было легче читать человеку. Однако в большинстве случаев данные JSON хранятся в одной строке, даже без символа окончания строки.
Очевидно, что это не очень удобно для чтения и редактирования вручную.
Вот тогда пригодится красивый принт. Название говорит само за себя: текст JSON переформатируется, чтобы он был более удобочитаемым для людей. Это называется красивая печать JSON.
Разбор и красивая печать JSON с использованием jq в Linux
Данные JSON можно анализировать с помощью текстовых процессоров командной строки, таких как awk, sed и gerp. На самом деле JSON.awk — это awk-скрипт, позволяющий сделать это. Однако есть несколько специальных инструментов для той же цели.
- jq или jshon, анализатор JSON для оболочки, оба они весьма полезны.
- Скрипты оболочки, такие как JSON.sh или jsonv.sh, для анализа JSON в оболочках bash, zsh или Dash.
- JSON.awk, awk-скрипт синтаксического анализатора JSON.
- Модули Python, такие как json.tool.
- underscore-cli, на основе Node.js и JavaScript.
В этом уроке я концентрируюсь только на jq — довольно мощном анализаторе JSON для оболочек с расширенными возможностями фильтрации и написания сценариев.
JSON Красивая печать
Данные JSON могут быть едиными и почти неразборчивыми для людей, поэтому, чтобы сделать их более читабельными, здесь используется красивая печать JSON.
Пример. Данные с сайта jsonip.com. Чтобы получить внешний IP-адрес в формате JSON, используйте curl или wget. инструменты, как показано ниже.
wget -cq http://jsonip.com/ -O -
Реальные данные выглядят так:
{"ip":"111.222.333.444","about":"/about","Pro!":"http://getjsonip.com"}
Теперь распечатайте это с помощью jq:
wget -cq http://jsonip.com/ -O - | jq '.'
Это должно выглядеть так, как показано ниже, после фильтрации результата с помощью jq.
{
"ip": "111.222.333.444",
"about": "/about",
"Pro!": "http://getjsonip.com"
}
То же самое можно сделать с помощью модуля Python json.tool. Вот пример:
cat anything.json | python -m json.tool
Это решение на основе Python подойдет большинству пользователей, но оно не так полезно, если Python не установлен заранее или его невозможно установить, например, во встроенных системах.
Однако у модуля Python json.tool есть явное преимущество: он кроссплатформенный. Таким образом, вы можете легко использовать его в Windows, Linux или Mac OS.
Рекомендуем прочитать:
- Предварительная типизация: сделайте вывод команды Ping более красивым и удобным для чтения
Как разобрать JSON с помощью jq
Во-первых, вам нужно установить jq, он уже поддерживается большинством дистрибутивов GNU/Linux, установите его с помощью соответствующих команд установщика пакетов.
В Арч Линукс:
sudo pacman -S jq
В Debian, Ubuntu, Linux Mint:
sudo apt-get install jq
В Федоре:
sudo dnf install jq
В openSUSE:
sudo zypper install jq
Для других ОС или платформ см. официальные инструкции по установке.
Основные фильтры и идентификаторы jq
jq мог читать данные JSON либо из stdin, либо из файла. Вы должны использовать оба в зависимости от ситуации.
Одиночный символ . — это самый простой фильтр. Эти фильтры также называются индексом идентификатора объекта. Использование одного . вместе с jq в основном печатает входной файл JSON.
Одинарные кавычки. Не обязательно всегда использовать одинарные кавычки. Но если вы объединяете несколько фильтров в одну строку, то использовать их необходимо.
Двойные кавычки. Любой специальный символ, например @, #, $, необходимо заключить в две двойные кавычки. как в этом примере, jq .foo."@bar"
Печать необработанных данных. По какой-либо причине, если вам нужны только окончательные проанализированные данные, не заключенные в двойные кавычки, используйте флаг -r с командой jq, как показано ниже. - jq -r .foo.bar.
Анализ конкретных данных
Чтобы отфильтровать определенную часть JSON, вам нужно изучить иерархию данных красиво напечатанного файла JSON.
Пример данных JSON из Википедии:
{
"firstName": "John",
"lastName": "Smith",
"age": 25,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021"
},
"phoneNumber": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "fax",
"number": "646 555-4567"
}
],
"gender": {
"type": "male"
}
}
Я собираюсь использовать эти данные JSON в качестве примера в этом руководстве и сохранить их как sample.json.
Допустим, я хочу отфильтровать адрес из файла sample.json. Итак, команда должна выглядеть так:
jq .address sample.json
Пример вывода:
{
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021"
}
Опять же, предположим, что мне нужен почтовый индекс, тогда мне нужно добавить еще один индекс идентификатора объекта, то есть еще один фильтр.
cat sample.json | jq .address.postalCode
Также обратите внимание, что фильтры чувствительны к регистру, и вам придется использовать одну и ту же строку, чтобы получить что-то значимое на выходе вместо нуля.
Анализ элементов массива JSON
Элементы массива JSON заключены в квадратные скобки, что, несомненно, весьма универсально в использовании.
Чтобы проанализировать элементы массива, вам необходимо использовать []идентификатор вместе с другим индексом идентификатора объекта.
В этом примере данных JSON номера телефонов хранятся внутри массива. Чтобы получить все содержимое из этого массива, вам нужно использовать только скобки, как в этом примере.
jq .phoneNumber[] sample.json
Допустим, вам просто нужен первый элемент массива, затем используйте номера объектов массива, начиная с 0, для первого элемента используйте [0], для следующих элементов он должен быть увеличен на единицу. каждый шаг.
jq .phoneNumber[0] sample.json
Примеры сценариев
Допустим, мне нужен только номер дома, а не все данные массива JSON. Вот тут-то и пригодится создание сценариев внутри команды jq.
cat sample.json | jq -r '.phoneNumber[] | select(.type == "home") | .number'
Здесь сначала я передаю результаты одного фильтра другому, затем использую атрибут select для выбора определенного типа данных и снова передаю результат другому фильтру.
Объяснение каждого типа фильтров и сценариев jq выходит за рамки и цели этого руководства. Настоятельно рекомендуется прочитать руководство JQ для лучшего понимания, приведенное ниже.
Ресурсы:
- https://stedolan.github.io/jq/manual/
- http://www.compciv.org/recipes/cli/jq-for-parsing-json/
- https://lzone.de/cheat-sheet/jq
Связанное чтение:
- Как анализировать файлы CSV в сценариях Bash в Linux
- Учебное пособие по YAML | Начало работы с YAML
Об авторе:
Арнаб Сатапати — заядлый энтузиаст Linux и открытого исходного кода. Он также любит возиться с технологиями и электроникой и делиться своим опытом в Интернете.