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?
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])'
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"
]
]
]
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.
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"
]
]
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)'
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)'