How to use `jq` to obtain the keys

sudhishkr picture sudhishkr · Jun 1, 2016 · Viewed 14.6k times · Source

My json looks like this :

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

My key keeps changing from time to time. So for example 20160522201409-jobsv1-1 may be something else tomorrow. Also I may more than one such entry in the json payload.

I want to echo $KEYS and I am trying to do it using jq.

Things I have tried : | jq .KEYS is the command i use frequently.

Is there a jq command to display all the primary keys in the json?

I only care about the hostname field. And I would like to extract that out. I know how to do it using grep but it is NOT a clean approach.

Answer

andlrc picture andlrc · Jun 1, 2016

You can simply use: keys:

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

And to get the first:

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

-r is for raw output:

--raw-output / -r: With this option, if the filter’s result is a string then it will be written directly to standard output rather than being formatted as a JSON string with quotes. This can be useful for making jq filters talk to non-JSON-based systems.

Source

If you want a known value below an unknown property, eg xxx.hostName:

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