Запуск json скрипта linux

☠ Как анализировать и вывести 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.

Читайте также:  Profire 2626 windows driver

Допустим, я хочу отфильтровать адрес из файла sample.json. Таким образом, команда должна быть такой:

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

Источник

Working with JSON in bash using jq

jq is a powerful tool that lets you read, filter, and write JSON in bash

Perhaps you’ve seen or even written bash that looks like this:

That’s tough to read and even tougher to write. You have to pipe to 4 different utilities just to get to a property in the JSON response body! Bash doesn’t understand JSON out of the box, and using the typical text manipulation tools like grep, sed, or awk, gets difficult. Luckily there’s a better way using a tool called jq.

jq can simplify the above bash to this:

That’s much nicer 😎. By making JSON easy to work with in bash, jq opens up a lot of automation possibilities that otherwise required me to write something in node.js (which isn’t bad, it just takes longer generally).

Why not just use node.js when you need to deal with JSON?

Sometimes node.js is the right tool. For most automation tasks, I like to use bash whenever possible because it’s faster and even more portable (I can share a bash script with team members that don’t have node.js installed). To me, bash is more expressive and succinct for certain tasks than node is.

Install jq

jq isn’t a built-in command in any environment, so you have to install it. Run brew install jq on macOS. See jq’s install help page for how to install on other environments.

Basics of jq

jq works similarly to sed or awk — like a filter that you pipe to and extract values from. Also like sed or awk, it basically has it’s own domain specific language (DSL) for querying JSON. Luckily, it’s really intuitive (unlike awk 😜).

Get a property

Let’s say we have JSON that looks like this:

To print out the foo property, we use the . operator followed by the property name.

That will print out 123 , as expected.

This works with nesting too. So .a.b.c.d will traverse down nested objects’ properties.

This, all by itself, is pretty useful. For a realistic and totally useful example, let’s write a script that gets the Astronomy Picture of the Day and sets it as our wallpaper (this is macOS only).

Yay! All this astronomy stuff makes it feel like the right time for a Neil deGrasse Tyson gif.

Note that if a property has a spaces or weird characters in it, you’ll have to use quotes. For example:

Also, be sure to always wrap your jq selector in a single-quotes, otherwise bash tries to interpret all the symbols like . , whereas we want jq to do that.

Iteration

Now let’s see how iteration works. The array or object value iterator operator, .[] , is what makes it possible.

Here’s a really basic example:

That will output 1, 2, 3 on separate lines.

In an array of objects, you can access a property on each item in the array like so:

Or on an object, .[] will output the value of each key/value pair:

So that will return 1 2.

Note that you can also pass an index to .[] , so

will return just bar.

Now how do we do something for each line? In the same way you’d handle anything that outputs multiple lines of information in bash: xargs , for loops, or some commands just handle multiple input items, etc. For example:

jq Functions

jq also has built-in “functions”. Returning to the previous object iteration example — let’s say we wanted get the keys of the object (not the values) as an array:

which will return a b . Note that we’re also using the pipe | operator, which works the same in jq as it does in bash — it takes the output from the left and passes it as input to the right.

Another handy function for arrays and objects is the length function, which returns the array’s length property or the number of properties on an object.

Читайте также:  Как поменять boot screen windows 10

You can get even fancier and create intermediary arrays and objects on the fly. Here, I’m combining the keys of the dependencies and devDependencies objects (from a package.json file) into an array, flattening it, and then getting the length.

That returns the number of dependencies and devDependencies a package.json contains.

Creating objects

You can also create objects on the fly. This can be useful for re-shaping some JSON. For example:

Let’s use it for real now

What if I wanted to audit my package.json dependencies and remove anything that’s not being used? Unused dependencies slow down npm installs for everyone and is just messy. I could manually grep usages of each dependency (via grep or in my IDE), but if you have a lot of dependencies that gets tedious fast, so let’s automate it.

[1] Here’s how the grep flags work:

–include and –exclude-dir narrow the files that get searched

-R means recursive, tells it to grep all matching files

–color colorizes the output

-n displays line numbers

[2] I have to export it so that a subshell can see it. If you want xargs to call a custom function, you have to call it in a subshell for some reason

[3] -r is for “raw-output”, so no quotes around values, which makes it suitable for processing in other bash commands. We get the dependency names as an array (this is equivalent to Object.keys(require(‘./package.json’).dependencies) in node.js)

[4] Then we pipe that to xargs which handles setting up a grep for each lines. Here’s how the xargs flags all work:

-t tells it to echo the constructed command; useful for debugging

-I <> defines the replacement string where the dependency string will get placed

-P 4 defines the concurrency, so 4 concurrent greps

we tell it to start a bash subshell where our grep_dep function is called with it’s args

There’s more that could be done to the grep-ing in that script to make it more robust, but that’s the basic gist.

Источник

Парсить 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.

У МИНЯ ПЫХА НИ УСТОНОВЛИНА!

Не прослойку, а отдельный инструмент.

Читайте также:  Whatsapp компьютеры mac или windows

Ты выдаешь желаемое за действительное, ТС нигде про пых не упоминал. Это был 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 есть везде, так что на сишечке можно сделать.

Источник

Оцените статью