如何使用jq打印多个结果

时间:2020-07-27 10:43:12

标签: json jq

我有一个来自HPE OneView的JSON输出。一个简短的例子是:

{
   "uri": "/rest/server-hardware/*/firmware?start=0&count=32",
   "total": 102,
   "start": 0,
   "prevPageUri": null,
   "type": "sever-firmwareinventory-list-1",
   "category": "server-hardware",
   "count": 32,
   "members": [
     {
         "uri": "/rest/server-hardware/37383638-5A43-3338-313356585742/firmware",
         "type": "server-hardware-firmware-1",
         "category": "server-hardware",
         "serverHardwareUri": "/rest/server-hardware/37383638-5A43-3338-313356585742",
         "serverName": "bb-r2-n12-ilo",
         "serverModel": "Proliant DL380 Gen10",
         "components": [
           {
               "componentVersion": "4.0.4.288",
               "componentLocation": "System Board",
               "componentName": "Server Platform Services (SPS) Firmware",
               "componentKey": "b34e5677-21dc-45d3-872b-42f76fee9053"
           },
           {
               "componentVersion": "U30 v1.46 (10/02/2018)",
               "componentLocation": "System Board",
               "componentName": "System ROM",
               "componentKey": "aa148d2e-6e09-453e-bc6f-62baa5f5ccc4"
               
           }
       ],
       "created": "2020-07-26T22:01:54.679Z"
     },
     {
         "uri": "/rest/server-hardware/37383638-5A43-3338-313052304C4A/firmware",
         "type": "server-hardware-firmware-1",
         "category": "server-hardware",
         "serverHardwareUri": "/rest/server-hardware/37383638-5A43-3338-313052304C4A",
         "serverName": "bb-r5-n10-ilo",
         "serverModel": "Proliant DL380 Gen10",
         "components": [
           {
               "componentVersion": "4.1.4.296",
               "componentLocation": "System Board",
               "componentName": "Server Platform Services (SPS) Firmware",
               "componentKey": "b34e5677-21dc-45d3-872b-42f76fee9053"
           },
           {
               "componentVersion": "U30 v1.36 (02/15/2018)",
               "componentLocation": "System Board",
               "componentName": "System ROM",
               "componentKey": null
               
           }
       ],
       "created": "2020-07-26T22:01:54.679Z"
     },
     {
         "uri": "/rest/server-hardware/37313438-3033-5A43-3338-30384D533730/firmware",
         "type": "server-hardware-firmware-1",
         "category": "server-hardware",
         "serverHardwareUri": "/rest/server-hardware/37313438-3033-5A43-3338-30384D533730",
         "serverName": "bb-r3-n1-ilo",
         "serverModel": "Proliant DL560 Gen10",
         "components": [
           {
               "componentVersion": "4.1.4.296",
               "componentLocation": "System Board",
               "componentName": "Server Platform Services (SPS) Firmware",
               "componentKey": "b34e5677-21dc-45d3-872b-42f76fee9053"
           },
           {
               "componentVersion": "U34 v2.10 (05/21/2019)",
               "componentLocation": "System Board",
               "componentName": "System ROM",
               "componentKey": "aa148d2e-6e08-453e-bc6f-63baa5f5ccc4"
               
           }
       ],
       "created": "2020-07-26T22:01:54.679Z"
     }
   ],
   "modified": "2020-07-27T09:30:55.882Z",
   "nextPageUri": null
}

我知道我可以使用jq -r '.members[] | select(.serverModel == "Proliant DL380 Gen10") | .components[] | select(.componentName == "System ROM") |.componentVersion' firmware来检索DL380 Gen 10s的系统ROM版本,但是我还想将serverName和系统ROM版本一起打印。我正在尝试的所有操作都给出了错误。有人知道怎么做吗?

1 个答案:

答案 0 :(得分:1)

构建字符串是一个好技巧。如果有帮助,您还可以构建中间对象,以使事物以更易于理解的形式显示。例如

$ cat stuff.jq
.members[]
   | select(.serverModel == "Proliant DL380 Gen10")
   | {
       name: .serverName,
       rom: ( .components[] | select(.componentName == "System ROM") | .componentVersion )
       }
   | "The ROM version for \(.name) is \(.rom)"

这将提供以下输出:

$ jq -rf stuff.jq firmware.json 
The ROM version for bb-r2-n12-ilo is U30 v1.46 (10/02/2018)
The ROM version for bb-r5-n10-ilo is U30 v1.36 (02/15/2018)
$