我想使用jq迭代这个JSON,但是我一直收到一个错误。
我使用的带有jq查询的bash脚本是:
for row in $(cat output.json | jq -r ' .outConfigs.faultInst[] | @base64'); do
_ijq() {
echo ${row} | base64 --decode | jq -r ${1}
}
echo $(_ijq '.@cause')
done
错误是:
jq: error (at :51):无法迭代null (null)退出状态5
请问我的jq查询有什么问题吗?
{
"configResolveClass": {
"@guid": "ddsd2222e2/5d0cce7c-5296-4a2a-b6c3-05bewwewerwewe",
"@response": "yes",
"@classId": "faultInst",
"outConfigs": {
"faultInst": [
{
"@ack": "yes",
"@cause": "power-problem",
"@changeSet": "",
"@code": "F0369",
"@created": "2019-07-22T15:56:14.616",
"@descr": "Power supply 1 in fabric interconnect A power: error",
"@dn": "sys/switch-A/psu-1/fault-F0369",
"@highestSeverity": "major",
"@id": "109305",
"@lastTransition": "2019-07-22T15:56:14.616",
"@lc": "",
"@occur": "1",
"@origSeverity": "major",
"@prevSeverity": "major",
"@rule": "equipment-psu-power-supply-problem",
"@severity": "major",
"@tags": "network,server",
"@type": "environmental"
},
{
"@ack": "yes",
"@cause": "equipment-inoperable",
"@changeSet": "",
"@code": "F0374",
"@created": "2019-07-22T15:56:14.616",
"@descr": "Power supply 1 in fabric interconnect A operability: inoperable",
"@dn": "sys/switch-A/psu-1/fault-F0374",
"@highestSeverity": "major",
"@id": "109306",
"@lastTransition": "2019-07-22T15:56:14.616",
"@lc": "",
"@occur": "1",
"@origSeverity": "major",
"@prevSeverity": "major",
"@rule": "equipment-psu-inoperable",
"@severity": "major",
"@tags": "network,server",
"@type": "equipment"
}
]
}
}
}
发布于 2019-09-27 18:27:59
您只是想在JSON中提取@cause
字段的内容吗?为什么所有涉及b64
的环形交叉路都会被编码和解码?尝试中的直接错误是没有在.configResolveClass
节点之前使用父字段.outConfigs
。
jq -r '.configResolveClass.outConfigs.faultInst[] | ."@cause"' json
使用base64
编码/解码逻辑扩展您的尝试,请执行
ijq() {
echo "$1" | base64 --decode | jq -r "${2}"
}
和您的迭代脚本重写为
while IFS= read -r b64; do
ijq "$b64" '."@cause"'
done < <(jq -r '.configResolveClass.outConfigs.faultInst[]| @base64' json)
为了更好地处理使用空分隔发出JSON文本和使用-d ''
读取空分隔符的问题,您可以这样做
while read -d '' -r b64; do
ijq "$b64" '."@cause"'
done < <(jq -j '.configResolveClass.outConfigs.faultInst[]| @base64| (. + "\u0000")' json)
发布于 2019-09-27 18:23:40
示例JSON将"configResolveClass“作为顶级键,因此您可以使用以下jq程序:
.configResolveClass.outConfigs.faultInst[] | @base64
https://stackoverflow.com/questions/58139608
复制相似问题