JQ тянет противоречивые результаты - PullRequest
0 голосов
/ 30 ноября 2018

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

aws ec2 describe-instances | jq -r '.Reservations[].Instances[].InstanceId'

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

i-01adbf1408ef1a333
i-0f92d078ce975c138
i-0e4e117c44b17b417
and on up to 47 instances

Этот следующий запрос все еще дает правильное количество результатов:

aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | [( .InstanceId ) ]'

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

aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | [( (.Tags[]|select(.Key=="Name")|.Value), .InstanceId ) ]'

Это вывод этой команды:

"i-08d3c05eed1316c9d"
"USAMZLAB10003","i-79eebb29"
"EOMLABAMZ1306","i-dbc98af4"
"USAMZLAB10002","i-d1dc1d83"
"i-0366c9bf18d27eb96"
"i-04d061334bc2f2d6b"
"USAMZLAB10007","i-f7a680a7"
"i-090e84eff4fece2b3"
"EOMLABAMZ1303","i-7cc98a53"
"EOMLABCSE713","i-08233926"
"i-0705eb3039cd56e04"
jq: error (at <stdin>:5013): Cannot iterate over null (null)

По какой-то причине этот запрос сообщает, что существует только 11 экземпляров сервера aws (когдадолжно быть 47).Он сообщает, что существуют серверы с тегами имен и без них.Но он не сообщает правильное количество серверов.

Он также выдает ошибку jq «Невозможно выполнить итерацию по нулю».

Я поместил исходный JSON в эту вставку:

Оригинал JSON

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

И почему добавление тега name к запросу значительно сокращает количество результатов?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

В вашем json не все экземпляры имеют набор Tags, поэтому ошибка.Вам придется обработать его или заменить вместо него пустой массив (.Tags // []).Но в целом я бы написал так:

.Reservations[].Instances[] | [ (.Tags // [] | from_entries.Name), .InstanceId ]
0 голосов
/ 01 декабря 2018

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

Вы можете использовать debug.

Почемудобавление тега name к запросу значительно уменьшит количество результатов?

Поскольку ваша jq-программа не соответствует вашим ожиданиям;в частности, вы пропустили, что происходит, когда .Tags оценивается как ноль.Чтобы понять несоответствие, рассмотрим:

$ jq -n '{} | .Tags[]|select(.Key=="Name")|.Value'

Еще одна проблема - обработка пустых массивов.Возможно, вы захотите обработать случай пустых массивов вдоль строк, предложенных следующим образом:

$ jq -n '{Tags: []} | (.Tags[] | select(.Key=="Name")|.Value) // null'
$ null

Одно решение

Если вы хотите, чтобы null появлялся, когда нет тега:

.Reservations[].Instances[]
| [ ((.Tags // [])[] | select(.Key=="Name") | .Value) // null,
    .InstanceId  ] 

Учитывая ваш ввод, первые две строки вывода будут:

[null,"i-08d3c05eed1316c9d"]
["USAMZLAB10003","i-79eebb29"]

Вариант с использованием try

.Reservations[].Instances[]
| [ try (.Tags[] | select(.Key=="Name")|.Value) // null,
    .InstanceId  ] 
...