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 valuedesde 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[].valueNo intente en mi computadora, así que no puedo probar ni publicar una respuesta completa, pero lo haré más tarde.sensorsen 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
jqque 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_arraydevolverí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
.valuede todos los objetos en.sensors. Es equivalente al filtrosi desea
.valueun objeto en particular, a menudo querrá incluir una selección . p.ejfuente