Estoy tratando de usar jq parser en mis scripts de bash y estoy confundido acerca de cómo funciona, ¿alguien podría explicar qué estoy haciendo mal?
Aquí está el archivo original del servicio externo y necesito obtenerlo value
:
root@test ~ # cat test.json
{"sensors":[{"id":34585,"value":-3.06,"time":1457031003}]}
Intentando enviarlo a jq
:
root@test ~ # cat narod.json | jq
{
"sensors": [
{
"id": 34585,
"value": -3.06,
"time": 1457031003
}
]
}
Tratando de obtener sensors
:
root@test ~ # cat narod.json | jq '.sensors'
[
{
"id": 34585,
"value": -3.06,
"time": 1457031003
}
]
Intentando llegar value
desde sensors
:
root@test ~ # cat narod.json | jq '.sensors.value'
jq: error (at <stdin>:0): Cannot index array with string "value"
bash
bash-scripting
SimWhite
fuente
fuente
jq sensors[].value
No intente en mi computadora, así que no puedo probar ni publicar una respuesta completa, pero lo haré más tarde.sensors
en su entrada JSON hay una matriz , no un dict. No tiene índices como .value, solo sus elementos internos. Por lo tanto, debe decirle a jq que aplique el índice a cada elemento de la matriz usando[]
Respuestas:
Como se discutió en los comentarios, en este caso específico debe usar:
Esto se debe a que debe indicar
jq
que espere una matriz (indicada por[
]
). Efectivamente esto está diciendo, 'busca en el siguiente nivel hacia abajo en la jerarquía'.En general, cuando encuentre una matriz (
[
) en su archivo json, debe proporcionar esto en su consulta:jq array_name[].object_in_array
devolvería el contenido deobject_in_array
.fuente
Algo a tener en cuenta al trabajar con matrices en jq es que el operador [] enumerará cada uno de los valores de la matriz, por lo que
devuelve el
.value
de todos los objetos en.sensors
. Es equivalente al filtrosi desea
.value
un objeto en particular, a menudo querrá incluir una selección . p.ejfuente