web-dev-qa-db-fra.com

trier la sortie des instances de description?

J'ai vu la question précédente sur ce sujet, mais la réponse était simplement "canalisez-la vers un langage de script!", Ce que je trouve insatisfaisant. Je sais que JMESPath a sort_by et sort, mais je ne sais pas comment les utiliser.

J'ai

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

Et il produit les bonnes données, juste dans un ordre aléatoire. Je veux trier par la dernière colonne des données, le nom du tag, alias Tags[?Key==`Name`], qui sous forme brute ressemble à ceci:

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

Pensées?

9
ColinK

réponse courte

ajouter

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

à la fin de votre expression. Les crochets ([]) Aplatiront la structure, sort_by(...) triera le résultat (qui est un tableau à quatre colonnes) par la quatrième colonne. La requête complète sera:

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

longue réponse

inspecter le résultat de votre requête actuelle

Selon les documents describe-instances , la structure de la sortie describe-instances Ressemble à ceci:

{
  "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"}]
        }
      ]
    }
  ]
}

Utilisation de votre requête d'origine

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

affichera

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

aplatir le résultat de la requête

Vous pouvez voir dans le résultat ci-dessus de votre requête que vous obtenez une liste de tables ([[{},{}],[{}]]). Je suppose que vous voulez plutôt une seule table non imbriquée ([{},{},{}]). Pour cela, ajoutez simplement [] À la fin de votre requête, c'est-à-dire.

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

Cela va aplatir la structure, résultant en

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

Il est maintenant temps de trier le tableau.

trier la table

Lorsque vous utilisez sort_by, Vous ne devez pas oublier de placer l'expression avant & (Esperluette). De cette façon, vous spécifiez un référence à cette expression, qui est ensuite passée à sort_by.

exemple: data | sort_by(@, &@) est équivalent à data | sort(@).

Le TagName dans le tableau que vous créez ([LaunchTime,InstanceId,PrivateIpAddress,TagName]) Est la quatrième colonne. Vous pouvez obtenir cette colonne en redirigeant le tableau vers l'expression [3]:

TableExpression | [3]

Mais à la place, vous voulez trier le tableau par la quatrième colonne. Vous pouvez le faire comme ceci:

TableExpression | sort_by(@, &[3])

et la requête résultante sera:

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

Résultat de la requête:

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

En tant qu'amélioration de la réponse de @ ColinK, je voulais trier un tableau qui avait des en-têtes de colonne personnalisés mais qui avait du mal avec la syntaxe. Je l'ai finalement fait fonctionner, alors j'ai pensé que je partagerais au cas où quelqu'un d'autre voudrait faire de même. J'ai ajouté une colonne pour State et triée par cette colonne.

--query 'sort_by(Reservations[*].Instances[*].{LaunchTime:LaunchTime, ID:InstanceId,IP:PrivateIpAddress,State:State.Name,Name:Tags[?Key==`Name`] | [0].Value}[], &State)' 
1
TreverW

Voici un autre exemple qui fonctionne également:

aws ec2 describe-instances --query 'Reservations[*].Instances[*].{Name:Tags[?Key==`Name`]|[0].Value,Instance:InstanceId} | sort_by(@, &[0].Name)'
0
toto