- ☠ Как анализировать и вывести JSON с помощью инструментов командной строки Linux
- Что такое красивый вывод json?
- JSON понятный вывод
- Как парсить JSON с jq
- Основные фильтры и идентификаторы jq
- Парсить JSON внутри bash-скрипта.
- How To Parse And Pretty Print JSON With Linux Commandline Tools
- What is pretty printing?
- Parse And Pretty Print JSON With Linux Commandline Tools
- JSON pretty printing
- How to parse JSON with jq
☠ Как анализировать и вывести JSON с помощью инструментов командной строки Linux
JSON – это легкий и независимый от языка формат хранения данных, который легко интегрируется с большинством языков программирования, а также понятен людям, конечно, при правильном форматировании.
Слово JSON означает JavaScript Object Notation, хотя оно начинается с JavaScript и в основном используется для обмена данными между сервером и браузером, но в настоящее время используется во многих областях, включая встроенные системы.
Здесь мы собираемся проанализировать и вывести JSON с помощью инструментов командной строки в Linux.
Это чрезвычайно полезно для обработки больших данных JSON в скриптах оболочки или для управления данными JSON в скриптах оболочки.
Что такое красивый вывод json?
Данные JSON структурированы так, чтобы быть более удобочитаемыми для человека.
Однако в большинстве случаев данные JSON хранятся в одной строке, даже без символа окончания строки.
Очевидно, что это не очень удобно для чтения и редактирования вручную.
Вот тогда красивый вывод полезен.
Название самоочевидно, переформатировать текст JSON, чтобы он было более читабельным для людей.
Данные JSON можно анализировать с помощью текстовых процессоров командной строки, таких как awk, sed и gerp.
На самом деле JSON.awk – это скрипт awk для этих целей.
Однако для этой цели есть несколько специализированных инструментов.
- jq или jshon, JSON-парсер для оболочки, оба они весьма полезны.
- Скрипты оболочки, такие как JSON.sh или jsonv.sh, для анализа JSON в оболочке bash, zsh или dash.
- JSON.awk, JSON-анализатор, awk-скрипт.
- Модули Python, такие как json.tool.
- underscore-cli, Node.js и на основе JavaScript.
В этом уроке я сосредоточусь только на jq, довольно мощном парсере JSON для оболочек с расширенными возможностями фильтрации и скриптов.
JSON понятный вывод
Данные JSON могут быть едины и почти неразборчивы для людей, поэтому, чтобы сделать их несколько читабельными, есть удобный вывод JSON.
Пример: данные с jsonip.com, чтобы получить внешний IP-адрес в формате JSON, используйте инструменты curl или wget, как показано ниже.
Фактические данные выглядят так:
Теперь выведем его с помощью JQ:
Вывод должен выглядеть как показано ниже после фильтрации результата с помощью jq.
То же самое можно сделать с модулем Python json.tool. Вот пример:
Это решение на основе Python должно подойти большинству пользователей, но оно не очень полезно, если Python не установлен или не может быть установлен, как во встроенных системах.
Однако модуль Python json.tool имеет явное преимущество – это кроссплатформенность.
Таким образом, вы можете использовать его без проблем в Windows, Linux или Mac OS.
Как парсить JSON с jq
Во-первых, вам нужно установить jq, он уже подхвачен большинством дистрибутивов GNU / Linux, и вы можете установить его с помощью соответствующих команд установщика пакетов.
На Debian, Ubuntu, Linux Mint:
Для других ОС или платформ смотрите официальные инструкции по установке.
Основные фильтры и идентификаторы jq
jq может читать данные JSON либо из стандартного ввода, либо из файла.
Вы должны использовать оба в зависимости от ситуации.
Единый символ это самый простой фильтр.
Эти фильтры также называются object identifier-index.
Одинарные кавычки – вам не обязательно использовать одинарные кавычки всегда. Но если вы объединяете несколько фильтров в одну строку, то вы должны их использовать.
Двойные кавычки – Вы должны заключать любые специальные символы, такие как @, #, $, в две двойные кавычки, как в этом примере, jq .foo. ”@Bar”
Вывод необработанных данных – по любой причине, если вам нужны только окончательные проанализированные данные, не заключенные в двойные кавычки, используйте флаг -r с командой jq, например так. – jq -r .foo.bar.
Чтобы отфильтровать определенную часть JSON, вы должны изучить иерархию данных файла JSON.
Пример данных JSON из Википедии:
Я собираюсь использовать эти данные JSON в качестве примера в этом учебном пособии, сохранив их как sample.json.
Допустим, я хочу отфильтровать адрес из файла sample.json. Таким образом, команда должна быть такой:
Снова допустим, что я хочу почтовый индекс, затем я добавлю еще один object identifier-index, то есть еще один фильтр.
Источник
Парсить JSON внутри bash-скрипта.
Здравствуйте, о магистры.
Мне нужно запланировать в cron скрипт, который ищет в JSON-файле по ссылке строки:
и при значении now больше 10 — выполняет команду.
Не знаю, как это сделать 🙁
скрипт, который ищет в JSON-файле по ссылке строки
ты выбрал не тот инструмент
хотя при большом желании можно и на баше — https://github.com/dominictarr/JSON.sh
Не знаю, в каком из слов ты сделал ошибку, но тут должны быть либо PHP, либо Python, либо Ruby.
Умеешь же ты находить всякую дичь. 🙂
Спасибо! К сожалению мой кругозор в этой области невелик. В screen запущен процесс, как в него передать команду я знаю. Сервак на Линуксе, подумал что логично будет использовать Баш. С php плохо знаком, даже не знал что его можно кроме web использовать — для таких целей. 1) Значит, я создаю php-файл с таким кодом, делаю его запускаемым?
2) COMMAND — просто консольная команда? Типа, скажем ‘screen -x ABC’
Срабатывает, но не пишет ничего.
Пишет текстом, не выполняя в консоли.
Сам ты дичь, я эту штуку активно использую для работы, при том, что проект, для которого JSON-данные нужны, на PHP.
Логично, ибо « выполняет команду, но выхлоп команды не выводит. если нужно видеть выхлоп, то тут уже сказали про system() . Есть еще passthru() — выполнение с передачей управления. А можно просто сделать echo `COMMAND`
Ну, я не сомневался в том, что ты упоротый 🙂
Обоснуй. Ты что, предлагаешь скриптики на похапэ сохранять-запускать-сохранять-запускать-сох. когда есть CLI? И я уж молчу про отсталость похапэ для обработки данных. У jq довольно вкусный синтаксис на пайпах, до жыэсного Lodash лишь немного не дотягивает.
Я предлагаю не страдать фигнёй. Пых прекрасно работает с json, использовать при этом bash, как прослойку. Походит на наркоманию.
У пыха есть один недостаток:
Однако, этого недостатка лишен, например, питон:
проект, для которого JSON-данные нужны, на PHP.
У МИНЯ ПЫХА НИ УСТОНОВЛИНА!
Не прослойку, а отдельный инструмент.
Ты выдаешь желаемое за действительное, ТС нигде про пых не упоминал. Это был bodqhrohro_promo , который эту адовую штуку на баше надыбал.
Вообще-то ты ответил на переписку с ним, если ты вдруг не заметил 😉
Да хоть отдельную ОС. Брать два инструмента для решения одной задачи, при том, что проще решить одним из них — на мой взгляд, дичь. Решить задачу ТОЛЬКО пыхом, питоном, да хоть крестами, будет всё же проще, чем городить огород с забором из велосипедов.
На сях можно по-быстрому накатать обработчик и спокойно пользоваться. А пыхпыхеры пусть идут в анус. Вместе с пхытонистами.
Только если есть свободное время. Однострочники на perl и ruby для решения поставленной задачи пишутся меньше чем за минуту.
Дай угадаю — данные для этого обработчика должны быть в KOI-8?
Помог так помог.
Зачем? В чистом ASCII же!
В любом случае, себе я сделал простой JSON-парсер, нужно было в CGI данные от клиента обрабатывать.
Ну, если есть время на изучение ненужных перла или руби.
Ага, а сишка типа проще руби?
Сишка проще чего угодно. Проще сишки только ассемблер, но там писанины дофига. Но, учитывая то, что gcc нынче очень здорово оптимизирует, на ассемблере практически уже ничего писать не нужно.
Она не баше, она на сишечке. Просто предоставляет CLI, который можно дёргать хоть из баша.
Задачи разные. Когда достаточно статики (пофильтровать что-то из входного или выходного JSON) — юзаю jq. Когда надо внутреннее состояние продебажить (динамика) — пихаю условное логирование уже непосредственно в похапэ, зачастую по точным данным, выковырянным тем же jq: к примеру, я знаю пару атрибутов, но не знаю точного id нужного объекта — нужно пофильтровать сначала по этому свойству и по другим свойствам окончательно вычленить нужный объект. Плюс для частых шаблонных задач у меня таки отдельные скриптики на похапэ, jq не очень подходит для проставления зависимостей между отделёнными по иерархии узлами.
В пыхе отвратительная функцианальщина, ты серьёзно? Он под потоковую обработку данных не заточен вообще. Сравни
Для программистов на %languagename%. Я в первую очередь просто программист и подбираю инструментарий под задачу. Причём для основного модуля язык выбирал не я, оно уже такое было. И я откровенно считаю эту попытку использовать похапэ для числодробилок маразмом, хотя бы из соображений производительности.
Если велосипеды старые, ржавые и никому не нужные — почему бы не построить из них забор? Прутьев на рамы наварить — и норм будет, красиво и оригинально. Обществу потребления лишь бы избавиться, а куда оно девается — никого не колышет, пока куча мусора возле города солнце перекрывать не начнёт.
В сишечке тоже. По сравнению с ассемблером это, конечно, верх компактности.
я бы согласился, что это недостаток, если бы у тебя была source-based система типа «протухшая фряха на портах», но как это может быть недостатком на RHEL?
(ты упоротый)^2 и ответил не тот псто
То есть, ты предлагаешь для запуска двух строчек тащить интерпретатор пыха с пристанями и кораблями, которого в системе нет, вместо того, чтобы эти две строчки замутить на питоне или перле, которые в любой системе уже есть, даже в соляре и аиксе? И потом, если надо его выполнить на многих системах, то тащить этот пых в каждую? Эффективненько.
Во-первых, это — телодвижение, которое надо не просто сделать, а задокументировать, занести в какие-нибудь ансиблы/паппеты и еще куда-нибудь. Потом, пых — это некий новый софт в системе, который надо поддерживать, обновлять и иже с ним.
Я уж не говорю про то, что в Демьяне, например, у пыха не так давно json-парсер отломали: вот, там какой-то одаренный чел в лицензии написал ‘The Software shall be used for Good, not Evil.’ Потом починили, конечно, но осадочек остался, ибо в пыхе такими коровьими лепешками все углы усеяны.
С пыхом все сложно, короче. Лучше на пистоне зафигачить, имхо.
тащить интерпретатор пыха с пристанями и кораблями, которого в системе нет
адепт экономии 10 мегабайт в системе? не, друже, нам не по пути.
остальные «аргументы» тоже настолько надуманные, что мне жалко на них время, лучше котиков полистаю
Иди в жопу, пыхпыхер чертов!
gcc есть везде, так что на сишечке можно сделать.
Источник
How To Parse And Pretty Print JSON With Linux Commandline Tools
JSON is a lightweight and language independent data storage format, easy to integrate with most programming languages and also easy to understand by humans, of course when properly formatted. The word JSON stands for JavaScript Object Notation, though it starts with JavaScript, and primarily used to exchange data between server and browser, but now being used in many fields including embedded systems. Here we’re going to parse and pretty print JSON with command line tools on Linux. It’s extremely useful for handling large JSON data in a shell scripts, or manipulating JSON data in a shell script.
What is pretty printing?
The JSON data is structured to be somewhat more human readable. However in most cases, JSON data is stored in a single line, even without a line ending character.
Obviously that’s not very convenient for reading and editing manually.
That’s when pretty print is useful. The name is quite self explanatory, re-formatting the JSON text to be more legible by humans. This is known as JSON pretty printing.
Parse And Pretty Print JSON With Linux Commandline Tools
JSON data could be parsed with command line text processors like awk, sed and gerp. In fact JSON.awk is an awk script to do that. However there are some dedicated tools for the same purpose.
jq or jshon, JSON parser for shell, both of them are quite useful.
Shell scripts like JSON.sh or jsonv.sh to parse JSON in bash, zsh or dash shell.
JSON.awk, JSON parser awk script.
Python modules like json.tool.
underscore-cli, Node.js and javascript based.
In this tutorial I’m focusing only on jq, which is quite powerful JSON parser for shells with advanced filtering and scripting capability.
JSON pretty printing
JSON data could be in one and nearly illegible for humans, so to make it somewhat readable, JSON pretty printing is here.
Example: A data from jsonip.com, to get external IP address in JSON format, use curl or wget tools like below.
The actual data looks like this:
Now pretty print it with jq:
This should look like below, after filtering the result with jq.
The Same thing could be done with python json.tool module. Here is an example:
This Python based solution should be fine for most users, but it’s not that useful where Python is not pre-installed or could not be installed, like on embedded systems.
However the json.tool python module has a distinct advantage, it’s cross platform. So, you can use it seamlessly on Windows, Linux or mac OS.
Suggested read:
How to parse JSON with jq
First, you need to install jq, it’s already picked up by most GNU/Linux distributions, install it with their respective package installer commands.
On Debian, Ubuntu, Linux Mint:
Basic filters and identifiers of jq
jq could read the JSON data either from stdin or a file. You’ve to use both depending on the situation.
The single symbol of . is the most basic filter. These filters are also called as object identifier-index. Using a single . along with jq basically pretty prints the input JSON file.
Single quotes — You don’t have to use the single quote always. But if you’re combining several filters in a single line, then you must use them.
Double quotes — You’ve to enclose any special character like @, #, $ within two double quotes, like this example, jq .foo.»@bar»
Raw data print — For any reason, if you need only the final parsed data, not enclosed within a double quote, use the -r flag with the jq command, like this. — jq -r .foo.bar.
Parsing specific data
To filter out a specific part of JSON, you’ve to look into the pretty printed JSON file’s data hierarchy.
An example of JSON data, from Wikipedia:
I’m going to use this JSON data as an example in this tutorial, saved this as sample.json.
Let’s say I want to filter out the address from sample.json file. So the command should be like:
Sample output:
Again let’s say I want the postal code, then I’ve to add another object identifier-index, i.e. another filter.
Also note that the filters are case sensitive and you’ve to use the exact same string to get something meaningful output instead of null.
Parsing elements from JSON array
Elements of JSON array are enclosed within square brackets, undoubtedly quite versatile to use.
To parse elements from a array, you’ve to use the []identifier along with other object identifier-index.
In this sample JSON data, the phone numbers are stored inside an array, to get all the contents from this array, you’ve to use only the brackets, like this example.
Let’s say you just want the first element of the array, then use the array object numbers starting for 0, for the first item, use [0], for the next items, it should be incremented by one each step.
Scripting examples
Let’s say I want only the the number for home, not entire JSON array data. Here’s when scripting within jq command comes handy.
Here first I’m piping the results of one filer to another, then using the select attribute to select a particular type of data, again piping the result to another filter.
Explaining every type of jq filters and scripting is beyond the scope and purpose of this tutorial. It’s highly suggested to read the JQ manual for better understanding given below.
Resources:
About the author:
Arnab Satapathi is an avid Linux and open source enthusiast. He also loves to fiddle with technology and electronics, and sharing his experience online.
Источник