Как я могу разобрать вывод JSON на оболочке?
Например, Amazon Web Services предоставляет интерфейс командной строки для получения статуса ваших экземпляров:
$ 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.
--output text
если вы хотите разобрать в оболочке без использования внешних инструментов, таких какjshon
.jshon
, я перешел по вашей ссылке Прочитав это, я могу только сказать, что я остался очень доволен, что я случайно услышал и установилjq
первым. Я думаю, что вам, возможно, также захочется услышать об этом, если вы этого еще не сделали - он не беспокоится обо всех этих параметрах командной строки и может выполнять свои собственные регулярные выражения - он даже позволяет вам объявлять функции и переменные, если вы хотите. Смотрите ответ здесь об этом, если вам интересно.Ответы:
Насколько я понимаю, вы ищете значение "Foo". Это действительно легко сделать с помощью инструмента командной строки оболочки
jq
. Это похожеsed
на то, что он реализует свой собственный язык синтаксического анализатора. Учитывая ваш пример:jq
можно получитьyes
так же просто, как:ВЫВОД
Вы можете пройтись по хэшу объекта или списку словаря, используя
.dot
нотацию, и индексированные массивы можно индексировать проще, используя, как вы уже догадались, числовые индексы в квадратных скобках. В приведенной выше команде я использую пустую форму индекса, чтобы указать, что я хочу, чтобы все итерируемые элементы этого уровня были расширены. Это может быть легче понять следующим образом:... который разбивает все значения для элементов второго уровня в хэше и получает меня ...
Это едва царапает поверхность относительно
jq
возможностей России. Это чрезвычайно мощный инструмент для сериализации данных в оболочке, он компилируется в один исполняемый двоичный файл в классическом стиле Unix, он очень вероятно доступен через менеджер пакетов для вашего дистрибутива и очень хорошо документирован. Пожалуйста, посетите егоgit
страницу и убедитесь сами.Кстати, еще один способ решения многоуровневых данных
json
- по крайней мере, чтобы понять, с чем вы работаете, - это пойти другим путем и использовать.dot
нотацию, чтобы разбить все значения на всех уровнях, например:Но гораздо лучше, вероятно, было бы просто использовать один из многих методов обнаружения или поиска, которые
jq
предлагаются для различных типов узлов.источник
Это ответ на вашу задачу, но не на ваш вопрос. Это означает, что вы можете достичь своей цели без использования анализатора JSON.
Утилита AWS cli может выводить только выбранные поля, используя
--query
аргумент. Это задокументировано здесь .Например:
Вы даже можете выбрать несколько полей, если хотите:
И вы можете показать несколько соответствующих структур:
источник