сортировать вывод описаний-экземпляров? - PullRequest
0 голосов
/ 08 июня 2018

Я видел предыдущий вопрос по этой теме, но ответ был просто «передать это на язык сценариев!», Что я считаю неудовлетворительным.Я знаю, что у JMESPath есть sort_by и sort, но я не могу понять, как их использовать.

У меня есть

aws ec2 describe-instances \
   --filters "Name=tag:Group,Values=production" "Name=instance-state-name,Values=running" "Name=tag:Name,Values=prod-*-${CURRENT_SHA}-*" \
   --query 'Reservations[*].Instances[*].[LaunchTime,InstanceId,PrivateIpAddress,Tags[?Key==`Name`] | [0].Value]' \
   --output table

И он выводит правильные данные,просто в случайном порядке.Я хочу отсортировать по последнему столбцу данных, имени тега, он же Tags[?Key==`Name`], который в необработанном виде выглядит так:

{
  "Tags": [{
    "Value": "application-server-ab3634b34364a-2",
    "Key": "Name"
  }, {
    "Value": "production",
    "Key": "Group"
  }]
}

Мысли?

Ответы [ 3 ]

0 голосов
/ 19 июня 2018

Ответ должен добавить | sort_by(@, &@[0][3])

aws ec2 describe-instances \
  --filters "Name=tag:Group,Values=production" "Name=instance-state-name,Values=running" "Name=tag:Name,Values=prod-*-${CURRENT_SHA}-*" \
  --query 'Reservations[*].Instances[*].[LaunchTime,InstanceId,PrivateIpAddress,Tags[?Key==`Name`] | [0].Value]| sort_by(@, &@[0][3])' \
  --output table
0 голосов
/ 29 апреля 2019

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

--query 'sort_by(Reservations[*].Instances[*].{LaunchTime:LaunchTime, ID:InstanceId,IP:PrivateIpAddress,State:State.Name,Name:Tags[?Key==`Name`] | [0].Value}[], &State)' 
0 голосов
/ 14 июня 2018

короткий ответ

добавьте

[] | sort_by(@, &[3])

в конце выражения.Скобки ([]) сгладят структуру, sort_by(...) отсортирует результат (таблица из четырех столбцов) по четвертому столбцу.Полный запрос будет:

--query 'Reservations[*].Instances[*].[LaunchTime,InstanceId,PrivateIpAddress,Tags[?Key==`Name`] | [0].Value][] | sort_by(@, &[3])'

длинный ответ

проверка текущего результата запроса

Согласно describe-instances документам , структуревывода describe-instances выглядит следующим образом:

{
  "Reservations": [
    {
      "Instances": [
        {
          "LaunchTime": "..LaunchTime..",
          "InstanceId": "R1I1",
          "PrivateIpAddress": "..PrivateIpAddress..",
          "Tags": [{"Key": "Name", "Value": "foo"}]
        },
        {
          "LaunchTime": "..LaunchTime..",
          "InstanceId": "R1I2",
          "PrivateIpAddress": "..PrivateIpAddress..",
          "Tags": [{"Key": "Name", "Value": "baz"}]
        }
      ]
    },
    {
      "Instances": [
        {
          "LaunchTime": "..LaunchTime..",
          "InstanceId": "R2I1",
          "PrivateIpAddress": "..PrivateIpAddress..",
          "Tags": [{"Key": "Name", "Value": "bar"}]
        }
      ]
    }
  ]
}

Использование исходного запроса

--query 'Reservations[*].Instances[*].[LaunchTime,InstanceId,PrivateIpAddress,Tags[?Key==`Name`] | [0].Value]'

приведет к выводу

[
  [
    [
      "..LaunchTime..",
      "R1I1",
      "..PrivateIpAddress..",
      "foo"
    ],
    [
      "..LaunchTime..",
      "R1I2",
      "..PrivateIpAddress..",
      "baz"
    ]
  ],
  [
    [
      "..LaunchTime..",
      "R2I1",
      "..PrivateIpAddress..",
      "bar"
    ]
  ]
]

сглаживания результата запроса

В приведенном выше результате запроса вы видите, что вы получаете список таблиц ([[{},{}],[{}]]).Я предполагаю, что вместо этого вы хотите одну не вложенную таблицу ([{},{},{}]).Для этого просто добавьте [] в конце вашего запроса, то есть

--query 'Reservations[*].Instances[*].[LaunchTime,InstanceId,PrivateIpAddress,Tags[?Key==`Name`] | [0].Value][]'

Это сгладит структуру, что приведет к

[
  [
    "..LaunchTime..",
    "R1I1",
    "..PrivateIpAddress..",
    "foo"
  ],
  [
    "..LaunchTime..",
    "R1I2",
    "..PrivateIpAddress..",
    "baz"
  ],
  [
    "..LaunchTime..",
    "R2I1",
    "..PrivateIpAddress..",
    "bar"
  ]
]

Теперь пришло время отсортировать таблицу.

сортировка таблицы

При использовании sort_by не забывайте добавлять выражение к & (амперсанд).Таким образом, вы указываете ссылку на это выражение, которое затем передается в sort_by.

пример: data | sort_by(@, &@) эквивалентно data | sort(@).

TagName в созданной вами таблице ([LaunchTime,InstanceId,PrivateIpAddress,TagName]) - четвертый столбец.Вы можете получить этот столбец, передав таблицу в выражение [3]:

TableExpression | [3]

Но вместо этого вы хотите отсортировать таблицу по четвертому столбцу.Вы можете сделать это следующим образом:

TableExpression | sort_by(@, &[3])

, и в результате запрос будет:

--query 'Reservations[*].Instances[*].[LaunchTime,InstanceId,PrivateIpAddress,Tags[?Key==`Name`][] | [0].Value] | sort_by(@, &[3])'

Результат запроса:

[
  [
    "..LaunchTime..",
    "R2I1",
    "..PrivateIpAddress..",
    "bar"
  ],
  [
    "..LaunchTime..",
    "R1I2",
    "..PrivateIpAddress..",
    "baz"
  ],
  [
    "..LaunchTime..",
    "R1I1",
    "..PrivateIpAddress..",
    "foo"
  ]
]
...