首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用jq搜索json字符串并输出父值?

如何使用jq搜索json字符串并输出父值?
EN

Stack Overflow用户
提问于 2022-05-22 21:20:37
回答 1查看 82关注 0票数 0

试图从jq中提取一个值,但并不像我最初想象的那么容易。

我有一个CAR="baga6e~tlwdcmli__QmbHKa~G65fMXzh.car"变量。

如何使用这个变量返回父"piece_cid"

示例:使用$CAR的bash值为baga6e~tlwdcmli__QmbHKa~G65fMXzh.car,id可以获得保存到$PIECE_CID的值为baga6ea4seaqa24ucggxkliw4la4tkgvhevv3dacavovghsmnnscclt4tlwdcmli的结果

我尝试了一些命令,并在谷歌上搜索了大约2个小时,但没有找到任何我想要的东西。对jq来说是全新的。希望有人能把我推向正确的方向?

代码语言:javascript
复制
{
  "response_code": 200,
  "response_entries": 2,
  "response": [
    {
      "piece_cid": "baga6ea4seaqa24ucggxkliw4la4tkgvhevv3dacavovghsmnnscclt4tlwdcmli",
      "dataset": "genome-ark",
      "padded_piece_size": 34359738368,
      "payload_cids": [
        "QmbHKaq6z321PqEG1BVLEAMpapq6YjkhdXpcs3G65fMXzh"
      ],
      "sources": [
        {
          "source_type": "Filecoin",
          "provider_id": "f0402371",
          "deal_id": 1928414,
          "original_payload_cid": "QmbHKaq6z321PqEG1BVLEAMpapq6YjkhdXpcs3G65fMXzh",
          "deal_expiration": "2022-05-22T21:14:30Z",
          "is_filplus": false,
          "sector_id": null,
          "sector_expires": null,
          "sample_retrieve_cmd": "lotus client retrieve --provider f0402371 --maxPrice 0 --allow-local --car 'QmbHKaq6z321PqEG1BVLEAMpapq6YjkhdXpcs3G65fMXzh' $(pwd)/baga6e~tlwdcmli__QmbHKa~G65fMXzh.car"
        }
      ],
      "sample_request_cmd": "echo curl -sLH \"Authorization: $( ./fil-spid.bash f01826669 )\" https://api.evergreen.filecoin.io/request_piece/baga6ea4seaqa24ucggxkliw4la4tkgvhevv3dacavovghsmnnscclt4tlwdcmli | sh"
    },
    {
      "piece_cid": "baga6ea4seaqa2acwhwril5pm6n4muqlsrdkk27cgrqowz67himgbcwc3jhitina",
      "dataset": "genome-ark",
      "padded_piece_size": 34359738368,
      "payload_cids": [
        "QmSJc7g8sdUZKt2MqSDnrd1DXxxHow6XwKQZLcoCoCeW42"
      ],
      "sources": [
        {
          "source_type": "Filecoin",
          "provider_id": "f0402371",
          "deal_id": 1927852,
          "original_payload_cid": "QmSJc7g8sdUZKt2MqSDnrd1DXxxHow6XwKQZLcoCoCeW42",
          "deal_expiration": "2022-05-22T20:11:00Z",
          "is_filplus": false,
          "sector_id": null,
          "sector_expires": null,
          "sample_retrieve_cmd": "lotus client retrieve --provider f0402371 --maxPrice 0 --allow-local --car 'QmSJc7g8sdUZKt2MqSDnrd1DXxxHow6XwKQZLcoCoCeW42' $(pwd)/baga6e~3jhitina__QmSJc7~oCoCeW42.car"
        }
      ],
      "sample_request_cmd": "echo curl -sLH \"Authorization: $( ./fil-spid.bash f01826669 )\" https://api.evergreen.filecoin.io/request_piece/baga6ea4seaqa2acwhwril5pm6n4muqlsrdkk27cgrqowz67himgbcwc3jhitina | sh"
    }
  ]
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-22 21:31:17

根据您可以期望搜索值的级别,这里有一个非常狭窄的解决方案,使用示例中的所有键:首先,遍历.response数组,然后只保留.sources[].sample_retrieve_cmd contains中给定字符串中的值的.sources[].sample_retrieve_cmdcontains中的那些项,然后使用-r输出.piece_cid作为原始文本的值。

代码语言:javascript
复制
CAR="baga6e~tlwdcmli__QmbHKa~G65fMXzh.car"
jq -r --arg car "$CAR" '
  .response[]
  | select(any(.sources[].sample_retrieve_cmd; contains($car)))
  | .piece_cid
'
代码语言:javascript
复制
baga6ea4seaqa24ucggxkliw4la4tkgvhevv3dacavovghsmnnscclt4tlwdcmli

演示

编辑:要将输出保存到变量中,只需将jq调用包装为命令替换$(),并将结果分配给您的变量:

代码语言:javascript
复制
PIECE_CID="$(jq -r --arg …)"

但请记住(理论上)可能存在多个匹配,上面的解决方案将打印出行文(在bash变量中给出一个新行分隔的结果列表)。

注意:避免在Bash中使用大写变量名。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72341360

复制
相关文章

相似问题

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