query example ec2 describe cli awscli aws json bash parameter-passing jq

json - example - pasando argumentos al filtro jq



awscli get instance id (3)

Aquí está mi config.json:

{ "env": "dev", "dev": { "projects" : { "prj1": { "dependencies": {}, "description": "" } } } }

Aquí están mis comandos de bash:

PRJNAME=''prj1'' echo $PRJNAME jq --arg v "$PRJNAME" ''.dev.projects."$v"'' config.json jq ''.dev.projects.prj1'' config.json

La salida:

prj1 null { "dependencies": {}, "description": "" }

Entonces, $ PRJNAME es prj1, pero la primera invocación solo da como resultado null .

¿Alguien me puede ayudar?


Como se preguntó en un comentario anterior, hay una manera de pasar múltiples argumentos. Tal vez haya una forma más elegante, pero funciona.

  • Si está seguro que siempre todas las claves necesarias puede usar esto:

jq --arg key1 $k1 --arg key2 $k2 --arg key3 $k3 --arg key4 $k4 ''.[$key1] | .[$key2] | .[$key3] | .[$key4] ''

  • Si la clave no se usa siempre, puedes hacerlo así:

jq --arg key $k '' if key != "" then .[$key] else . end''

  • Si la clave a veces se refiere a una matriz:

jq --arg key $k '' if type == "array" then .[$key |tonumber] else .[$key] end''

Por supuesto que puedes combinar estos!


El programa jq .dev.projects."$v" en su ejemplo, literalmente, intentará encontrar una clave llamada "$v" . Intente lo siguiente en su lugar:

jq --arg v "$PRJNAME" ''.dev.projects[$v]'' config.json


Puedes usar también --argjson cuando hagas tu json.

--arg a v set variable $a to value <v>; --argjson a v set variable $a to JSON value <v>;