Разбор 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 
  • При использовании $ hash_array
  • ZSH: вставить завершение на первой вкладке, даже если оно неоднозначно?
  • Объединение команды, включающей одиночные и двойные кавычки для другой команды
  • Является ли распространенным установить zsh на производственных серверах?
  • Существует ли крючковая система для оболочки?
  • Как получить экран для запуска / загрузки .zprofile при запуске нового окна?
  • Есть ли способ перечислить количество файлов при использовании dpkg -L для отображения файлов пакета?
  • Zsh запрашивает полную ширину с пользовательским вводом в следующей строке
  • Пробелы как разрывы строк из команды inline for loop
  • Как сообщить остальной системе, что моя оболочка изменилась с zsh на bash?
  • Команда Zsh autocomplete ls только с каталогами
  • Linux и Unix - лучшая ОС в мире.