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]",
...
]
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 .
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)
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.
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: