Команда jq в linux

Обновлено: 01.07.2024


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

Здесь мы собираемся проанализировать и вывести JSON с помощью инструментов командной строки в Linux.

Это чрезвычайно полезно для обработки больших данных JSON в скриптах оболочки или для управления данными JSON в скриптах оболочки.

Что такое красивый вывод json?

Данные JSON структурированы так, чтобы быть более удобочитаемыми для человека.

Однако в большинстве случаев данные JSON хранятся в одной строке, даже без символа окончания строки.

Очевидно, что это не очень удобно для чтения и редактирования вручную.

Вот тогда красивый вывод полезен.

Название самоочевидно, переформатировать текст JSON, чтобы он было более читабельным для людей.

Данные JSON можно анализировать с помощью текстовых процессоров командной строки, таких как awk, sed и gerp.

Однако для этой цели есть несколько специализированных инструментов.

  • 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.

Фактические данные выглядят так:

Теперь выведем его с помощью JQ:

Вывод должен выглядеть как показано ниже после фильтрации результата с помощью jq.

То же самое можно сделать с модулем Python json.tool. Вот пример:

Это решение на основе Python должно подойти большинству пользователей, но оно не очень полезно, если Python не установлен или не может быть установлен, как во встроенных системах.

Таким образом, вы можете использовать его без проблем в Windows, Linux или Mac OS.

Как парсить JSON с jq

Во-первых, вам нужно установить jq, он уже подхвачен большинством дистрибутивов GNU / Linux, и вы можете установить его с помощью соответствующих команд установщика пакетов.

На Debian, Ubuntu, Linux Mint:

Для других ОС или платформ смотрите официальные инструкции по установке.

Основные фильтры и идентификаторы jq

jq может читать данные JSON либо из стандартного ввода, либо из файла.

Вы должны использовать оба в зависимости от ситуации.

Единый символ это самый простой фильтр.

Эти фильтры также называются object identifier-index.

Чтобы отфильтровать определенную часть JSON, вы должны изучить иерархию данных файла JSON.

Пример данных JSON из Википедии:

Я собираюсь использовать эти данные JSON в качестве примера в этом учебном пособии, сохранив их как sample.json.

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

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

A lightweight and flexible command-line JSON processor.

  • Output all elements from arrays (or all key-value pairs from objects) in a JSON file:
  • Read JSON objects from a file into an array, and output it (inverse of jq .[] ):
  • Output the value of a given key of the first element in a JSON file:
  • Output the value of a given key of each element in a JSON file:

Show JVM Process Status of current user. List all JVM…

A simple journal application for your command line. More information:…

Как получить дерево директорий на Bash одним однострочником

Фото Как установить PostgreSQL на Linux и создать базу и пользователя

Как установить PostgreSQL на Linux и создать базу и пользователя

PostgreSQL - система управления базой данных общего назначения. Одна из самых распространённых баз данных, используемая на многих коммерческих и некоммерческих проектах.

Фото Как скопировать вывод команды из терминала в буфер обмена Linux и MacOS

Как скопировать вывод команды из терминала в буфер обмена Linux и MacOS

Скорее приятный, чем необходимы "трюк", но возможность использовать возможность скопировать вывод в буфер обмена – действительно круто иной раз выручает.

Фото Как создать неизменяемый файл в Linux / MacOS / FreeBSD

Как создать неизменяемый файл в Linux / MacOS / FreeBSD

Само собой, root может всё (если введёт пару команд), однако, это вполне легальный способ запретить изменение файла.

Фото Как удалить все Docker образы и контейнеры

Как удалить все Docker образы и контейнеры

Не всегда нужно удалять всё, но объяснение данного "рецепта" объяснит как в целом удалять образы и контейнеры.

Фото Bash < потоки ввода > вывода && управляющие конструкции || коротко о главном

Bash < потоки ввода > вывода && управляющие конструкции || коротко о главном

Небольшая заметка о конструкциях Bash, в которых путается большинство новичков. А именно: >, <, &, &&, |, ||

Фото Лучше плохо, но сейчас. Взгляд на пути развития ПО

Лучше плохо, но сейчас. Взгляд на пути развития ПО

Сейчас такие языки как Perl и Ruby чувствуют себя не лучшим образом. Но ещё 10 – 15 лет назад они были на "гребне волны".

Фото Как запустить программу в терминале в фоне, без вывода какого либо текста

Как запустить программу в терминале в фоне, без вывода какого либо текста

Запускаем программу в терминале в фоновом режиме и разбираемся, как и почему это работает в Linux / Unix терминале.

Фото Малоизвестные, но полезные возможности утилиты less

Малоизвестные, но полезные возможности утилиты less

Команда less является одной из самых известных на ряду с cd, cp, mv и т.д. Но используется less зачастую далеко не на всю мощь.

Фото Как синхронизировать локальную Git версию репозитория с серверной

Как синхронизировать локальную Git версию репозитория с серверной

Прибираемся в локальной версии Git – чтобы локальная версия соответствовала удалённой (серверной) версии Git проекта.

Фото Так ли безопасен Linux? Несколько коммитов с уязвимосятми в stable

Так ли безопасен Linux? Несколько коммитов с уязвимосятми в stable

Исследователи сумели пройти code-review с реквестами в ядро Linux, заведомо содержащими добавление уязвимостей.

Фото Microsoft открывает исходники, а её IDE супер-популярна

Microsoft открывает исходники, а её IDE супер-популярна

Решил сложить пару фактов и немного над этим поразмыслить. Реально ли Microsoft "переобулись"?

Фото Пример своей консольной команды в Django проекте

Пример своей консольной команды в Django проекте

Если вы работали с Django проектом, то, скорее всего, запускали команды из консоли (manage.py). В Django есть простой способ писать свои команды для управления проектом.

Фото Как на Bash посчитать число строк в проекте (директории)

Как на Bash посчитать число строк в проекте (директории)

Ниже будет представлен однострочник, решающий данную задачу на Bash + пошаговое описание его работы.

Фото Как на Bash получить файлы, изменённые за сегодняшний день

Как на Bash получить файлы, изменённые за сегодняшний день

Bash имеет огромные возможности по программированию/скриптованию и администрированию операционной системы. Не важно: Linux это, FreeBSD, или MacOS – на Bash можно сделать многое.

Фото Как установить часовой пояс в Linux

Как установить часовой пояс в Linux

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

Фото Как найти самые большие папки и файлы в Linux

Как найти самые большие папки и файлы в Linux

Когда кончается место на жестком диске, возникает закономерный вопрос: на что же оно было потрачено, какие файлы разрослись больше положенного?

Фото Команда grep – полезные ключи и примеры использования

Команда grep – полезные ключи и примеры использования

У команды "grep" довольно много различных особенностей. особенно, если учесть, что с английского это "решето" – а что может войти в решето , не факт что выйдет!

Подсказка терминала на ПК с Linux.

Fatmawati Achmad Zaenuri/Shutterstock

JSON и jq

JSON расшифровывается как JavaScript Object Notation. Это схема, которая позволяет кодировать данные в простые текстовые файлы с самоописанием. В файле JSON нет комментариев - его содержимое не требует пояснений. Каждое значение данных имеет текстовую строку, называемую «именем» или «ключом». Это говорит вам, каково значение данных. Вместе они известны как пары имя: значение или пары ключ: значение. Двоеточие ( : ) отделяет ключ от его значения.

«Объект» - это набор пар ключ: значение. В файле JSON объект начинается с открытой фигурной скобки ( < ) и заканчивается закрывающей скобкой ( >). JSON также поддерживает «массивы», которые представляют собой упорядоченные списки значений. Массив начинается с открывающей скобки ( [ ) и заканчивается закрывающей скобкой ( ] ).

Конечно, из этих простых определений может возникнуть произвольная сложность. Например, объекты могут быть вложены в объекты. Объекты могут содержать массивы, а массивы также могут содержать объекты. Все они могут иметь открытые уровни вложенности.

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

Однако, будучи матерью изобретения, родилась утилита jq ! С помощью jq мы можем легко анализировать JSON в оболочке Bash. И неважно, приходится ли вам работать с хорошо продуманным, элегантным JSON или с тем, из чего состоят кошмары.

Как установить jq

Нам пришлось установить jq во все дистрибутивы Linux, которые мы использовали для исследования этой статьи.

Чтобы установить jq в Ubuntu, введите следующую команду:


Чтобы установить jq в Fedora, введите эту команду:


Чтобы установить jq на Manjaro, введите эту команду:


Как сделать JSON читабельным

JSON не заботится о пустом пространстве, и макет на него не влияет. Пока он следует правилам грамматики JSON, системы, обрабатывающие JSON, могут его прочитать и понять. Из-за этого JSON часто передается как простая длинная строка без учета макета. Это экономит немного места, поскольку табуляции, пробелы и символы новой строки не нужно включать в JSON. Конечно, обратная сторона всего этого - когда человек пытается это прочитать.

Давайте возьмем короткий объект JSON с сайта НАСА, который сообщает нам положение Международной космической станции. Мы будем использовать curl , который может загружать файлы, чтобы получить для нас объект JSON.


Теперь, приложив немного усилий, вы можете прочитать это. Вы должны выбрать значения данных, но это непросто и непросто. Давайте повторим это, но на этот раз мы пропустим его через jq .

jq использует фильтры для анализа JSON, и самый простой из этих фильтров - точка ( . ), что означает «распечатать весь объект». По умолчанию jq красиво печатает вывод.

Собираем все вместе и набираем следующее:


Это намного лучше! Теперь мы можем точно видеть, что происходит.

Мы попробуем еще раз. На этот раз мы введем следующее и перенаправим вывод в файл с именем «iss.json»:


Это дает нам хорошо продуманную копию объекта JSON на нашем жестком диске.

Доступ к значениям данных

Как мы видели выше, jq может извлекать значения данных, передаваемые по конвейеру из JSON. Он также может работать с JSON, хранящимся в файле. Мы собираемся работать с локальными файлами, чтобы командная строка не была загромождена командами curl . Это должно упростить отслеживание.

Самый простой способ извлечь данные из файла JSON - указать имя ключа для получения его значения данных. Введите точку и название ключа без пробела. Это создает фильтр по имени ключа. Нам также нужно указать jq , какой файл JSON использовать.

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


jq печатает текст значения message в окне терминала.

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

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


Значение отметки времени извлекается и печатается в окне терминала.

Но как мы можем получить доступ к значениям внутри объекта iss_position ? Мы можем использовать точечную нотацию JSON. Мы включим имя объекта iss_position в «путь» к значению ключа. Для этого имя объекта, внутри которого находится ключ, будет предшествовать имени самого ключа.

Мы вводим следующее, включая имя ключа latitude (обратите внимание, что между «.iss_position» и «.latitude» нет пробелов):


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

  • Перечислите имена ключей в командной строке.
  • Разделите их запятыми ( , ).
  • Заключите их в кавычки ( " ) или апострофы ( ' ).

Имея это в виду, мы вводим следующее:


Два значения печатаются в окне терминала.

Работа с массивами

Давайте возьмем другой объект JSON из НАСА.

На этот раз мы воспользуемся списком космонавтов, которые сейчас находятся в космосе:


Хорошо, это сработало, давайте сделаем это еще раз.


Теперь давайте введем следующее, чтобы проверить ваш файл:


Как показано ниже, теперь мы видим список космонавтов в космосе, а также их космические корабли.


Этот объект JSON содержит массив с именем people . Мы знаем, что это массив, благодаря открывающей скобке ( [ ) (выделенной на скриншоте выше). Это массив объектов, каждый из которых содержит две пары ключ: значение: name и craft .

Как и раньше, мы можем использовать точечную нотацию JSON для доступа к значениям. Мы также должны включить скобки ( [] ) в имя массива.

Имея это в виду, мы набираем следующее:


На этот раз все значения имени выводятся в окно терминала. Мы попросили jq напечатать значение имени для каждого объекта в массиве. Довольно аккуратно, да?

Мы можем получить имя отдельного объекта, если поместим его позицию в массиве в скобки ( [] ) в командной строке. В массиве используется индексация с нулевым смещением, что означает, что объект в первой позиции массива равен нулю.

Для доступа к последнему объекту в массиве вы можете использовать -1; чтобы получить предпоследний объект в массиве, вы можете использовать -2 и так далее.

Иногда объект JSON предоставляет количество элементов в массиве, как в этом случае. Наряду с массивом он содержит пару ключ: имя с именем число со значением шесть.

В этом массиве находится следующее количество объектов:


Вы также можете указать начальный и конечный объекты в массиве. Это называется «нарезкой», и это может немного сбивать с толку. Помните, что в массиве используется нулевое смещение.

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


Это печатает объекты в массиве с индексом два (третий объект в массиве) и три (четвертый объект в массиве). Он останавливает обработку в массиве с индексом четыре, который является пятым объектом в массиве.

Чтобы лучше понять это, поэкспериментируйте в командной строке. Вы скоро увидите, как это работает.

Как использовать трубы с фильтрами

Мы скажем jq передать массив people в фильтр .name , который должен перечислить имена астронавтов в окне терминала.


Создание массивов и изменение результатов

Мы можем использовать jq для создания новых объектов, таких как массивы. В этом примере мы извлечем три значения и создадим новый массив, содержащий эти значения. Обратите внимание, что открывающая ( [ ) и закрывающая скобки ( ] ) также являются первым и последним символами в строке фильтра.


Вывод заключен в квадратные скобки и разделен запятыми, что делает его правильно сформированным массивом.

Числовыми значениями также можно управлять по мере их извлечения. Давайте извлечем метку времени из файла положения ISS, а затем извлечем ее снова и изменим возвращаемое значение.

Для этого набираем следующее:


Это полезно, если вам нужно добавить или удалить стандартное смещение из массива значений.

Чтобы напомнить себе, что содержится в файле iss.json , напечатайте следующее:


Допустим, мы хотим избавиться от пары ключ: значение message . Это не имеет ничего общего с положением Международной космической станции. Это просто флаг, указывающий на то, что местоположение было получено успешно. Если он превышает потребности, мы можем обойтись без него. (Вы также можете просто проигнорировать это.)


Обратите внимание, что на самом деле это не удаляет его из файла «iss.json»; он просто удаляет его из вывода команды. Если вам нужно создать новый файл без пары ключ: значение message , запустите команду, а затем перенаправьте вывод в новый файл.

Более сложные объекты JSON

Давайте найдем еще данные НАСА. На этот раз мы будем использовать объект JSON, содержащий информацию о местах падения метеоров со всего мира. Это более крупный файл с гораздо более сложной структурой JSON, чем те, с которыми мы имели дело ранее.


Чтобы увидеть, как выглядит JSON, мы набираем следующее:


Как показано ниже, файл начинается с открывающей скобки ( [ ), поэтому весь объект представляет собой массив. Объекты в массиве представляют собой коллекции пар ключ: значение, и есть вложенный объект с именем geolocation . Объект geolocation содержит дополнительные пары ключ: значение и массив с именем координаты .


Давайте извлечем названия ударов метеорита от объекта с позиции индекса 995 до конца массива.

Мы введем следующее, чтобы пропустить JSON через три фильтра:


Фильтры работают следующим образом:

  • .[995:] : This tells jq to process the objects from array index 995 through the end of the array. No number after the colon ( : ) is what tells jq to continue to the end of the array.
  • : этот итератор массива сообщает jq о необходимости обработки каждого объекта в массиве.
  • .name : этот фильтр извлекает значение имени.

С небольшим изменением мы можем извлечь из массива последние 10 объектов. «-10» указывает jq начать обработку объектов 10 с конца массива.


Как и в предыдущих примерах, мы можем ввести следующее, чтобы выбрать один объект:


Мы также можем применить нарезку к строкам. Для этого мы введем следующее, чтобы запросить первые четыре символа имени объекта в массиве с индексом 234:


Мы также можем видеть конкретный объект целиком. Для этого мы вводим следующее и включаем индекс массива без каких-либо фильтров key: value:


Если вы хотите видеть только значения, вы можете сделать то же самое без имен ключей.

В нашем примере мы набираем эту команду:


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


Если вы хотите получить вложенные значения, вы должны идентифицировать объекты, которые образуют «путь» к ним.

Например, чтобы ссылаться на значения координаты , мы должны включить всеобъемлющий массив, вложенный объект geolocation и вложенный массив координаты . , как показано ниже.


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


Функция длины

Функция jq length дает разные показатели в зависимости от того, что было применено, например:

  • Струны: длина строки в байтах.
  • Объекты: количество пар ключ: значение в объекте.
  • Массивы: количество элементов массива в массиве.

Следующая команда возвращает длину значения name в 10 объектах в массиве JSON, начиная с позиции индекса 100:


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


Клавиши Функция

Вы можете использовать функцию ключей, чтобы узнать о JSON, с которым вам нужно работать. Он может сказать вам, как называются ключи и сколько объектов находится в массиве.

Чтобы найти ключи в объекте people в файле «astro.json», мы вводим эту команду:


Чтобы узнать, сколько элементов находится в массиве people , мы набираем эту команду:


Это показывает, что имеется шесть элементов массива с нулевым смещением, пронумерованных от нуля до пяти.

Функция has ()

Вы можете использовать функцию has () , чтобы запросить JSON и узнать, имеет ли объект определенное имя ключа. Обратите внимание, что имя ключа должно быть заключено в кавычки. Мы заключим команду фильтра в одинарные кавычки ( ' ) следующим образом:

В

Каждый объект в массиве проверяется, как показано ниже.

Выход из

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

В

Не приближайтесь к JSON без него

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

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

jq intro

jq intro

Мы все иногда сталкиваемся с необходимостью вытащить нужную информацию из JSON или YAML файлов. Многие уже познакомились с мощью утилиты jq. Судя по публикациям на Хабре, например, этой, и вопросам в qna, тема до сих пор актуальна.

Мне в очередной раз пришлось вспомнить специфический DSL jq чтобы восстановить накопленные за долгое время закладки в Хроме, не сохранённые при апгрейде. Точнее, файл Bookmarks в формате .json сохранился, но ни в какую не хотел импортироваться в новый Хром. Хочу поделиться рецептом решения этой проблемы, заодно упорядочить собранные в разных местах миниатюрные скрипты для решения похожих проблем.

JQ в действительности полноценный язык программирования со всеми атрибутами - переменными, типами данных, арифметикой, циклами и условными переходами, массой встроенных функций и возможностью добавления новых. Удивительно, всё это в программке размером 30KB, страницей "man jq" такого же размера и библиотекой libjq размером 300KB.

Итак, заглянув в свой Bookmarks с несколькими сотнями ссылок, первый вопрос - какова структура этого .json файла? По счастью, я уже знал как быстро её посмотреть и использовать в дальнейших запросах. Вот эта команда:

. $ jq '[paths|join(".")]' Bookmarks|head -n 16
[
"checksum",
"roots",
"roots.bookmark_bar",
"roots.bookmark_bar.children",
"roots.bookmark_bar.children.0",
"roots.bookmark_bar.children.0.children",
"roots.bookmark_bar.children.0.children.0",
"roots.bookmark_bar.children.0.children.0.children",
"roots.bookmark_bar.children.0.children.0.children.0",
"roots.bookmark_bar.children.0.children.0.children.0.date_added",
"roots.bookmark_bar.children.0.children.0.children.0.guid",
"roots.bookmark_bar.children.0.children.0.children.0.id",
"roots.bookmark_bar.children.0.children.0.children.0.name",
"roots.bookmark_bar.children.0.children.0.children.0.type",
"roots.bookmark_bar.children.0.children.0.children.0.url",

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

Хром умеет импортировать закладки в виде .html файла. Ссылка в этом файле выглядит таким образом:

Таким образом, нам надо достать из json файла все значения .url и .name, затем добавить их в таблицу .html как строки. Значение ADD_DATE не обязательно. Вот так это извлекается из уже знакомой нам структуры данных .json файла:

Здесь вместо индекса массива в .json файле использовано обозначение [], означающее итерацию по всем элементам массива. Идём дальше. С такой же лёгкостью можно добавить в вывод желаемые строки, чередуя строки в фильтре со значениями из хэша:

Внимательный читатель заметил, что выше использованы 2 опции запуска jq:

-j --join-output - не вставлять новую строку в выводе, её можно задавать самому, см. символ \n

-r --raw-input - не выводить кавычки как в объектах json, их снова задаю вручную

Импорт покажет все закладки без разбиения на папки, но это лишь хороший повод навести порядок, удалить ненужные и отсортировать их в менеджере закладок Хрома с учётом прожитых лет.

Замечательный сборник рецептов нашёл у Remy Sharp'а. Нашёл его поиском "jq cookbook", лучше него что-то сделать трудно. Надеюсь, его рецепты будут доступны несмотря на текущий статус draft.

Нельзя не посоветовать также документацию автора jq Stephen Dolan'а. Кроме самой документации, есть также tutorial, wiki, FAQ и ещё один сборник рецептов.

Читайте также: