web-dev-qa-db-fra.com

Utilisation de jq pour analyser et afficher plusieurs champs dans un json en série

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 -

  1. Les guillemets que je ne veux pas.
  2. Le retour de voiture que je ne veux pas.
  3. C'est brouillé. Ma requête affiche tous les prénoms en premier, puis tous les noms de famille. Cependant, je veux le premier, le dernier, le dernier, dernière paire.
170
San

Je recommande d'utiliser l'interpolation de chaîne:

jq '.users[] | "\(.first) \(.last)"'

référence

267
Eric Hartford

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'
153
abraham

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)"'
11
machzqcq

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)

3
ThorSummoner

Cela produira un tableau de noms

> jq '[ .users[] | (.first + " " + .last) ]' ~/test.json

[
  "Stevie Wonder",
  "Michael Jackson"
]
2
TinyRoy
jq '.users[]|.first,.last' | paste - -
0
optman