J'ai ce Json
{
"users": [
{
"first": "Stevie",
"last": "Wonder"
},
{
"first": "Michael",
"last": "Jackson"
}
]
}
En utilisant jq, je voudrais afficher le prénom et le nom de famille en série. Ainsi -
Stevie Wonder
Michael Jackson
Voici à quel point je suis arrivé -
jq '.users[].first, .users[].last'
Mais ça affiche
"Stevie"
"Michael"
"Wonder"
"Jackson"
Notez ce qui suit -
Vous pouvez utiliser addition pour concaténer des chaînes.
Des chaînes sont ajoutées en étant jointes dans une chaîne plus grande.
jq '.users[] | .first + " " + .last'
Alors que les deux réponses ci-dessus fonctionnent bien si key, value sont des chaînes, j’ai eu la difficulté d’ajouter une chaîne et un entier (erreurs jq utilisant les expressions ci-dessus)
Condition préalable: construire une url en dessous de json
pradeep@seleniumframework>curl http://192.168.99.103:8500/v1/catalog/service/Apache-443 | jq .[0]
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 251 100 251 0 0 155k 0 --:--:-- --:--:-- --:--:-- 245k
{
"Node": "myconsul",
"Address": "192.168.99.103",
"ServiceID": "4ce41e90ede4:compassionate_wozniak:443",
"ServiceName": "Apache-443",
"ServiceTags": [],
"ServiceAddress": "",
"ServicePort": 1443,
"ServiceEnableTagOverride": false,
"CreateIndex": 45,
"ModifyIndex": 45
}
Solution:
curl http://192.168.99.103:8500/v1/catalog/service/Apache-443 |
jq '.[0] | "http://" + .Address + ":" + "\(.ServicePort)"'
Je me suis approché de ce que je voulais en faisant quelque chose comme ça
cat my.json | jq '.my.prefix[] | .primary_key + ":", (.sub.prefix[] | " - " + .sub_key)' | tr -d '"'
La sortie est assez proche de yaml pour que je puisse généralement l'importer dans d'autres outils sans trop de problèmes. (Je suis toujours à la recherche d'un moyen d'exporter de manière fondamentale un sous-ensemble de json d'entrée)
Cela produira un tableau de noms
> jq '[ .users[] | (.first + " " + .last) ]' ~/test.json
[
"Stevie Wonder",
"Michael Jackson"
]
jq '.users[]|.first,.last' | paste - -