Mon json ressemble à ceci:
{
"20160522201409-jobsv1-1": {
"vmStateDisplayName": "Ready",
"servers": {
"20160522201409 jobs_v1 1": {
"serverStateDisplayName": "Ready",
"creationDate": "2016-05-22T20:14:22.000+0000",
"state": "READY",
"provisionStatus": "PENDING",
"serverRole": "ROLE",
"serverType": "SERVER",
"serverName": "20160522201409 jobs_v1 1",
"serverId": 2902
}
},
"isAdminNode": true,
"creationDate": "2016-05-22T20:14:23.000+0000",
"totalStorage": 15360,
"shapeId": "ot1",
"state": "READY",
"vmId": 4353,
"hostName": "20160522201409-jobsv1-1",
"label": "20160522201409 jobs_v1 ADMIN_SERVER 1",
"ipAddress": "10.252.159.39",
"publicIpAddress": "10.252.159.39",
"usageType": "ADMIN_SERVER",
"role": "ADMIN_SERVER",
"componentType": "jobs_v1"
}
}
Ma clé change de temps en temps. Ainsi, par exemple 20160522201409-jobsv1-1
peut-être autre chose demain. Je peux également avoir plusieurs entrées de ce type dans la charge utile json.
Je veux echo $KEYS
et j'essaie de le faire en utilisant jq
.
Ce que j'ai essayé: | jq .KEYS
est la commande que j'utilise fréquemment.
Existe-t-il une commande jq pour afficher toutes les clés primaires du json?
Je me soucie uniquement du champ hostname
. Et je voudrais extraire cela. Je sais comment le faire en utilisant grep
mais ce n'est PAS une approche propre.
Vous pouvez simplement utiliser: keys
:
% jq 'keys' my.json
[
"20160522201409-jobsv1-1"
]
Et pour obtenir le premier:
% jq -r 'keys[0]' my.json
20160522201409-jobsv1-1
-r
est pour la sortie brute:
--raw-output / -r:
Avec cette option, si le résultat du filtre est une chaîne, il sera écrit directement dans la sortie standard au lieu d'être formaté en tant que chaîne JSON avec guillemets. Cela peut être utile pour faire parler les filtres jq à des systèmes non basés sur JSON.
Si vous voulez une valeur connue sous une propriété inconnue, par exemple xxx.hostName
:
% jq -r '.[].hostName' my.json
20160522201409-jobsv1-1