Создание объекта с помощью JMESpath

Я пытаюсь создать запрос JMESpath с помощью AWS CLI, который печатает таблицу, показывающую несколько выбранных свойств в виде строк. Я могу получить то, что хочу, используя jq, но я хочу сделать это только с awscli, чтобы он мог быть отформатирован в виде таблицы. Это возможно? Ниже приведен результат, который я хочу получить с использованием синтаксиса построения объекта jq:

% aws --output json ec2 describe-instances --instance-id $id --query 'Reservations[].Instances[0]' | jq '.[0] | {InstanceType,PrivateIpAddress,LaunchTime}'
{
  "InstanceType": "g4dn.4xlarge",
  "PrivateIpAddress": "172.31.15.37",
  "LaunchTime": "2021-02-17T14:49:30+00:00"
}

Самое близкое, что я пришел, - это использование хэша с множественным выбором, но это делает каждый элемент столбцом, поэтому он не выглядит хорошо, если элементов больше, чем несколько.

% aws --output table ec2 describe-instances --instance-id $id --query 'Reservations[].Instances[0].{size: InstanceType, PrivateIP: PrivateIpAddress, LaunchTime: LaunchTime}' 
---------------------------------------------------------------
|                      DescribeInstances                      |
+---------------------------+----------------+----------------+
|        LaunchTime         |   PrivateIP    |     size       |
+---------------------------+----------------+----------------+
|  2021-02-17T14:49:30+00:00|  172.31.15.37  |  g4dn.4xlarge  |
+---------------------------+----------------+----------------+

person Elliott B    schedule 17.02.2021    source источник
comment
но это делает каждый элемент столбцом, поэтому он не будет хорошо выглядеть, если элементов больше, чем несколько, не могли бы вы привести пример этого, поскольку ваш фактический пример показывает только один элемент в таблице   -  person β.εηοιτ.βε    schedule 17.02.2021
comment
Будет только один экземпляр. Я только что включил в пример 3 свойства, но на самом деле я буду использовать около 10 свойств, что делает таблицу чрезвычайно широкой.   -  person Elliott B    schedule 17.02.2021
comment
О, так вы хотите, чтобы это была строка для каждого свойства, верно?   -  person β.εηοιτ.βε    schedule 17.02.2021


Ответы (1)


В выводе table разные объекты JSON будут рассматриваться как разные строки.
Если вы действительно хотите иметь свойство для каждой строки, вы можете создать объект для каждого свойства с помощью запроса JMESPath следующим образом:

Reservations[].Instances[0].[ { Property: `LaunchTime`, Value: LaunchTime }, { Property: `Size`, Value: InstanceType }, { Property: `PrivateIP`, Value: PrivateIpAddress } ]

В структуре JSON, например:

{
  "Reservations": [
    {
      "Instances": [
        {
          "InstanceType": "g4dn.4xlarge",
          "PrivateIpAddress": "172.31.15.37",
          "LaunchTime": "2021-02-17T14:49:30+00:00"
        }
      ]
    }
  ]
}

В результате вы получите этот JSON:

[
  [
    {
      "Property": "LaunchTime",
      "Value": "2021-02-17T14:49:30+00:00"
    },
    {
      "Property": "Size",
      "Value": "g4dn.4xlarge"
    },
    {
      "Property": "PrivateIP",
      "Value": "172.31.15.37"
    }
  ]
]

И тогда таблица должна выглядеть так:

----------------------------------------------
|              DescribeInstances             |
+--------------+-----------------------------+
|   Property   |            Value            |
+--------------+-----------------------------+
|  LaunchTime  |  2021-02-17T14:49:30+00:00  |
+--------------+-----------------------------+
|     Size     |         g4dn.4xlarge        |
+--------------+-----------------------------+
|  PrivateIP   |         172.31.15.37        |
+--------------+-----------------------------+
person β.εηοιτ.βε    schedule 17.02.2021
comment
Отлично спасибо! - person Elliott B; 18.02.2021