首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用jq从base64编码文本中迭代JSON数据

使用jq从base64编码文本中迭代JSON数据
EN

Stack Overflow用户
提问于 2019-09-27 18:13:25
回答 2查看 1.3K关注 0票数 1

我想使用jq迭代这个JSON,但是我一直收到一个错误。

我使用的带有jq查询的bash脚本是:

代码语言:javascript
运行
复制
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查询有什么问题吗?

代码语言:javascript
运行
复制
{
  "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"
        }
      ]
    }
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-27 18:27:59

您只是想在JSON中提取@cause字段的内容吗?为什么所有涉及b64的环形交叉路都会被编码和解码?尝试中的直接错误是没有在.configResolveClass节点之前使用父字段.outConfigs

代码语言:javascript
运行
复制
jq -r '.configResolveClass.outConfigs.faultInst[] | ."@cause"' json

使用base64编码/解码逻辑扩展您的尝试,请执行

代码语言:javascript
运行
复制
ijq() {
    echo "$1" | base64 --decode | jq -r "${2}"
}

和您的迭代脚本重写为

代码语言:javascript
运行
复制
while IFS= read -r b64; do
    ijq "$b64" '."@cause"'
done < <(jq -r '.configResolveClass.outConfigs.faultInst[]| @base64' json)

为了更好地处理使用空分隔发出JSON文本和使用-d ''读取空分隔符的问题,您可以这样做

代码语言:javascript
运行
复制
while read -d '' -r b64; do
    ijq "$b64" '."@cause"'
done < <(jq -j '.configResolveClass.outConfigs.faultInst[]| @base64| (. + "\u0000")' json)
票数 1
EN

Stack Overflow用户

发布于 2019-09-27 18:23:40

示例JSON将"configResolveClass“作为顶级键,因此您可以使用以下jq程序:

代码语言:javascript
运行
复制
.configResolveClass.outConfigs.faultInst[] | @base64
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58139608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档