web-dev-qa-db-fra.com

Utilisation de jq avec bash pour exécuter la commande pour chaque objet du tableau

Comment puis-je exécuter une commande bash pour chaque objet json dans un tableau json à l'aide de jq? Jusqu'à présent, j'ai ceci:

cat credentials.json | jq -r '.[] | .user, .date, .email' | mycommand -u {user} -d {date} -e {email}

Cela ne semble pas fonctionner. Comment puis-je prendre les paramètres du tableau json dans ma commande?

Mon fichier json ressemble à ceci:

[
   "user": "danielrvt",
   "date": "11/10/1988",
   "email": "[email protected]",
   ...
]
15
danielrvt

Votre meilleur pari est probablement de sortir chaque enregistrement au format TSV, puis de le lire à partir d'une boucle Shell.

jq -r '.[]|[.user, .date, .email] | @tsv' |
  while IFS=$'\t' read -r user date email; do
    mycommand -u "$user" -d "$date" -e "$email"
  done

jq lui-même n'a rien à voir avec un appel system pour exécuter une commande externe à partir d'un filtre, bien qu'il semble que ils y travaillent .

19
chepner

Vous pourriez avoir jq sortir les commandes à exécuter, quelque chose comme

.[] | "mycommand \(.user|@sh) \(.date|@sh) \(.email|@sh)"

Ensuite, exécutez-le. Quelque chose comme

bash <(jq -r '.[] | "mycommand \(.user|@sh) \(.date|@sh) \(.email|@sh)"' foo)
9
kojiro

Avec xargs:

curl localhost:8082/connectors | jq .[] | xargs -L1 -I'{}' curl -XDELETE 'localhost:8082/connectors/{}' 

Ou de manière équivalente, pour afficher la sortie de cette première boucle:

echo '["quickstart-file-sink4","quickstart-file-source","quickstart-file-sink","quickstart-file-sink2","quickstart-file-sink3","quickstart-file-source2"]' | jq .[] | xargs -L1 -I'{}' curl -XDELETE 'localhost:8082/connectors/{}' 

jq .[] supprime un niveau de confinement, de sorte qu'une liste devient une seule ligne par élément.

xargs -L1 traite une ligne à la fois

xargs -I'{}' spécifie que la chaîne {} être remplacé par la ligne d'entrée lors de l'appel de la commande suivante.

xargs est essentiellement un opérateur de carte pour le Shell.

6
Marcin

J'ai rencontré récemment le même problème où xargs n'aide pas beaucoup en raison de l'ensemble d'arguments relativement compliqué que je voulais faire circuler. J'ai donc implémenté un filtre sh (et ses amis) sur jq. Je n'ai pas encore eu le temps d'écrire de la documentation et des tests pour cela, donc je n'ai pas encore créé de PR pour qu'il devienne une partie de la base de code officielle. Alors maintenant, c'est seulement pour ceux qui sont prêts à compiler cette version eux-mêmes:

https://github.com/haochenx/jq/tree/sh-support

2
Haochen Xie