Разбор JSON на оболочке

Как я могу разобрать вывод JSON на оболочке?

Например, веб-службы Amazon предоставляют CLI для получения статуса ваших экземпляров:

$ aws ec2 describe-instances <my_instance_id> 

Но команда возвращает строку JSON. Результат этой команды выглядит следующим образом:

 $ aws ec2 describe-instances x12345 { "Reservations" : { "OwnerId": "1345345" "Groups": [], "SecurityGroups": [ { "Foo" : "yes" "Bar" : "no } ] } } 

Существуют ли встроенные оболочки, которые можно использовать для анализа вывода JSON?

Например, я хотел бы зафиксировать в переменной оболочки FOO следующий output["Reservations"]["SecurityGroups"][0]{"Foo"} .

В случае, если это помогает, меня особенно интересуют решения, которые могут работать с Zsh.

2 Solutions collect form web for “Разбор JSON на оболочке”

Насколько я понимаю, вы ищете значение «Foo». Это очень легко сделать с помощью инструмента командной строки jq . Это нечто похожее на sed поскольку оно реализует собственный язык парсера. Учитывая ваш пример:

 json=' { "Reservations" : { "OwnerId" : "1345345", "Groups" : [], "SecurityGroups" : [ { "Foo" : "yes", "Bar" : "no" } ] } }' 

jq может получить yes так же просто, как:

 printf %s "$json" | jq '.[].SecurityGroups[0].Foo?' 

ВЫВОД

 "yes" 

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

 printf %s "$json" | jq '.[][]' 

… который вырывает все значения для элементов второго уровня в хэше и получает меня …

 "1345345" [] [ { "Foo": "yes", "Bar": "no" } ] 

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

Кстати, еще один способ разрешить многоуровневые данные в json – по крайней мере, чтобы получить представление о том, с чем вы работаете, – может быть, пойти другим путем и использовать нотацию .dot чтобы вырвать все значения на всех уровнях, например :

 printf %s "$json" | jq '..' { "Reservations": { "OwnerId": "1345345", "Groups": [], "SecurityGroups": [ { "Foo": "yes", "Bar": "no" } ] } } { "OwnerId": "1345345", "Groups": [], "SecurityGroups": [ { "Foo": "yes", "Bar": "no" } ] } "1345345" [] [ { "Foo": "yes", "Bar": "no" } ] { "Foo": "yes", "Bar": "no" } "yes" "no" 

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

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

AWS cli util имеет возможность выводить только поля выбора, используя аргумент --query . Это описано здесь .

Например:

 $ aws ec2 describe-instances \ --query 'Reservations[0].Instances[0].SecurityGroups[0].GroupName' \ --instance-id i-6b272337 \ --output text mongodb 

Вы можете даже выбрать несколько полей, если хотите:

 $ aws ec2 describe-instances \ --query 'Reservations[0].Instances[0].SecurityGroups[0].[GroupName,GroupId]' \ --instance-id i-6b272337 \ --output text mongodb sg-710ffa14 

И вы также можете показать несколько подходящих структур:

 $ aws ec2 describe-instances \ --query 'Reservations[0].Instances[0].SecurityGroups[*].[GroupName,GroupId]' \ --instance-id i-6b272337 \ --output text mongodb sg-710ffa14 default sg-a0243bcc 
  • Сортировка строк с помощью escape-кодов ANSI
  • Каким образом можно определить (из сценария), установлено ли программное обеспечение?
  • Как запустить команду glob ZSH рекурсивно для подкаталогов
  • Проблема с пониманием привязок ключей
  • zsh HISTFILE - все еще читается из ~ / .zsh_history
  • перемещать файлы по шаблону с помощью zsh / zmv
  • Отметьте дескриптор как терминал для теста -t
  • Использовать Netrw или Nerdtree в Zsh / Bash для выбора файла BY BROWSING?
  • Экран: текущий каталог в заголовке (не как заголовок)
  • ZSH: вставить завершение на первой вкладке, даже если оно неоднозначно?
  • что такое zsh-эквивалент экспорта bash -f
  • Interesting Posts

    Проблема с загрузкой Java JDK с помощью WGET на Ubuntu

    Невозможно смонтировать NFS «Программа не зарегистрирована ошибка»

    Как предотвратить запрос, требующий перезагрузки служб при установке libpq-dev

    Неопределенная ссылка на символ «XSetFillStyle»

    Тестирование маршрутизатора Linux на ноутбуке с одним сетевым адаптером

    Как увеличить горизонтальную чувствительность прокрутки мыши?

    Как вывести команду оболочки в переменную?

    Почему файл перевода bash не содержит всех текстов ошибок?

    Обновить настройку выделения Vim и цветовую схему

    Бесшовный режим с виртуальным боксом: цвет фона на стороне окна

    Возможно ли открыть TCP-туннель в Linux в качестве специального символьного устройства?

    Где можно скачать debian-test.iso?

    Можно ли указать путь, в котором имя каталога является переменной?

    Что такое переносимый (POSIX) способ достижения замещения процесса?

    Использовать ли только программный рендеринг программного обеспечения intel gpu (Mesa)?

    Linux и Unix - лучшая ОС в мире.