Назад | Перейти на главную страницу

Как указать jq напечатать содержимое двух ключей для каждого экземпляра, возвращаемого aws ec2 cli

запуск aws ec2 describe-instance вернет текст json, подобный следующему:

{
    "Reservations": [
        {
            "Instances": [
                  "PublicDnsName": "ec2..."
                    "VpcId": "vpc-...",
                        ...
            "Instances": [

Я знаю, что для каждого «экземпляра» я могу извлечь содержимое одного поля, например PublicDnsName, используя jq следующим образом: jq '.Reservations[].Instances[].PublicDnsName' в котором будут перечислены DNS-имена для моих экземпляров. Но как мне извлечь два или более поля и разделить их пробелом, запятой или чем-то еще? Я хочу, чтобы PublicDnsName и VpcId отображались рядом для каждого экземпляра.

В частности, я ищу список случаев, когда VpcId имеет значение null, undefined или не существует. Другими словами, мне нужен список моих классических экземпляров, и он мне нужен через api, чтобы я мог обработать результаты.

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

Чтобы выбрать несколько полей, вы можете использовать Строительство объекта. Например, этот фильтр создает объект, содержащий только PublicDnsName и VpcId из каждого экземпляра:

  .Reservations[]
| .Instances[]
| {PublicDnsName, VpcId}

Если этот фильтр находится в filter.jq и образцы данных из этого другого ответа находятся в data.json затем бег

$ jq -M -f filter.jq data.json

производит

{
  "PublicDnsName": "xxxxxxxx",
  "VpcId": "vpc-eb09eb8e"
}

Если у вас есть объекты, содержащие то, что вы хотите, легко преобразовать данные в другой формат (например, csv). С этим фильтром

  .Reservations[]
| .Instances[]
| {PublicDnsName, VpcId}
| [.[]]
| @csv

и -r вариант

$ jq -M -r -f filter.jq data.json

jq производит

"xxxxxxxx","vpc-eb09eb8e"

Чтобы добавить условие фильтрации, например VpcId не равен нулю, добавьте Выбрать.

  .Reservations[]
| .Instances[]
| {PublicDnsName, VpcId}
| select(.VpcId != null)
| [.[]]
| @csv