如何使用`jq`来获取密钥

时间:2016-06-01 19:56:39

标签: json bash shell parsing jq

我的json看起来像这样:

{
  "20160522201409-jobsv1-1": {
    "vmStateDisplayName": "Ready",
    "servers": {
      "20160522201409 jobs_v1 1": {
        "serverStateDisplayName": "Ready",
        "creationDate": "2016-05-22T20:14:22.000+0000",
        "state": "READY",
        "provisionStatus": "PENDING",
        "serverRole": "ROLE",
        "serverType": "SERVER",
        "serverName": "20160522201409 jobs_v1 1",
        "serverId": 2902
      }
    },
    "isAdminNode": true,
    "creationDate": "2016-05-22T20:14:23.000+0000",
    "totalStorage": 15360,
    "shapeId": "ot1",
    "state": "READY",
    "vmId": 4353,
    "hostName": "20160522201409-jobsv1-1",
    "label": "20160522201409 jobs_v1 ADMIN_SERVER 1",
    "ipAddress": "10.252.159.39",
    "publicIpAddress": "10.252.159.39",
    "usageType": "ADMIN_SERVER",
    "role": "ADMIN_SERVER",
    "componentType": "jobs_v1"
  }
}

我的钥匙不时变化。因此,例如明天20160522201409-jobsv1-1可能是另一回事。此外,我可能在json有效载荷中不止一个这样的条目。

我想echo $KEYS,我想尝试使用jq

我尝试过的事情: | jq .KEYS是我经常使用的命令。

是否有jq命令显示json中的所有主键?

我只关心hostname字段。我想提取出来。我知道如何使用grep来做这件事,但这不是一个干净的方法。

1 个答案:

答案 0 :(得分:16)

您只需使用:keys

% jq 'keys' my.json
[
  "20160522201409-jobsv1-1"
]

获得第一个:

% jq -r 'keys[0]' my.json
20160522201409-jobsv1-1

-r用于原始输出:

  

--raw-output / -r:使用此选项,如果过滤器的结果是字符串,则它将直接写入标准输出,而不是格式化为带引号的JSON字符串。这对于使jq过滤器与非基于JSON的系统进行通信非常有用。

Source

如果您希望已知值低于未知属性,例如xxx.hostName

% jq -r '.[].hostName' my.json
20160522201409-jobsv1-1