How to use `jq` to obtain the keys
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.
If you want a known value below an unknown property, eg xxx.hostName
:
% jq -r '.[].hostName' my.json
20160522201409-jobsv1-1
Related videos on Youtube
sudhishkr
Updated on June 02, 2020Comments
-
sudhishkr almost 4 years
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 usingjq
.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 usinggrep
but it is NOT a clean approach.-
Charles Duffy almost 8 yearsIs there a reason you need to know that key, rather than just directly querying through to the things underneath it?
-
Charles Duffy almost 8 years(BTW, an all-caps shell variable name such as
$KEYS
is bad form; the POSIX spec for environment variables specifies that it's the namespace of lower-case names reserved for application use; since shell variables and environment variables share a namespace, following this convention avoids collisions. See pubs.opengroup.org/onlinepubs/009695399/basedefs/…) -
sudhishkr almost 8 yearsI am interested in the hostname, and i dont care about the keys. And I can have multiple entries in the json.
-
Charles Duffy almost 8 yearsAhh! Going straight to the hostnames is easy. :)
-
-
Charles Duffy almost 8 yearsYou might also mention how to get, say, an
ipAddress
without knowing the top-layer key. -
ruakh almost 8 yearsYou have the right idea, but I think the OP is actually looking for
jq -r 'keys[]' my.json
. -
Charles Duffy almost 8 years...actually, the OP has clarified in the comments on the question: "I am interested in the hostname, and [I] don't care about the keys"; thus it would be
.[].hostName
of interest.