簡體   English   中英

如何在 json 中搜索字符串並使用 jq 輸出父值?

[英]How to search json for a string and output a parent value using jq?

試圖用 jq 提取一個值,但似乎並不像我最初想象的那么容易。

我有一個變量CAR="baga6e~tlwdcmli__QmbHKa~G65fMXzh.car"

如何使用此變量返回父"piece_cid"

示例:使用值為baga6e~tlwdcmli__QmbHKa~G65fMXzh.car的 bash 變量$CAR ,我能夠將結果保存到$PIECE_CID ,值為baga6ea4seaqa24ucggxkliw4la4tkgvhevv3dacavovghsmnnscclt4tlwdcmli

我嘗試了一些命令並在谷歌上搜索了大約 2 個小時,但沒有找到我想要的東西。 對 jq 來說是全新的。 希望有人能把我推向正確的方向?

{
  "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"
    }
  ]
}

根據您可以期望的搜索值的級別,這是一個使用示例中所有鍵的非常狹窄的解決方案:首先,遍歷.response數組,然后僅保留.sources[].sample_retrieve_cmd中的any值的那些項目contains給定的字符串,然后使用-r.piece_cid的值作為原始文本輸出。

CAR="baga6e~tlwdcmli__QmbHKa~G65fMXzh.car"
jq -r --arg car "$CAR" '
  .response[]
  | select(any(.sources[].sample_retrieve_cmd; contains($car)))
  | .piece_cid
'
baga6ea4seaqa24ucggxkliw4la4tkgvhevv3dacavovghsmnnscclt4tlwdcmli

演示


編輯:要將輸出保存到變量中,只需將jq調用包裝為命令替換$()並將結果分配給您的變量:

PIECE_CID="$(jq -r --arg …)"

但請記住,(理論上)可能存在多個匹配項,上面的解決方案將逐行打印出來(在 bash 變量中為您提供一個以換行符分隔的結果列表)。

注意:避免在 Bash 中使用大寫的變量名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM