2016-06-01 5 views
3

Mein json sieht wie folgt aus zu erhalten:So verwenden `jq` die Schlüssel

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

Mein Schlüssel hält von Zeit zu Zeit zu ändern. So zum Beispiel 20160522201409-jobsv1-1 kann morgen etwas anderes sein. Auch ich darf mehr als einen solchen Eintrag in der Json-Payload.

Ich möchte echo $KEYS und ich versuche es mit jq zu tun.

Dinge, die ich versucht habe: | jq .KEYS ist der Befehl, den ich häufig verwende.

Gibt es einen jq Befehl, um alle Primärschlüssel im json anzuzeigen?

Ich interessiere mich nur für das Feld hostname. Und ich möchte das herausholen. Ich weiß, wie man es mit grep macht, aber es ist kein sauberer Ansatz.

+0

Gibt es einen Grund, warum Sie benötigen diesen Schlüssel zu wissen, anstatt nur direkt an die Abfrage durch Dinge darunter? –

+1

(BTW, ein All-Caps-Shell-Variablenname wie '$ KEYS' ist eine schlechte Form; die POSIX-Spezifikation für Umgebungsvariablen gibt an, dass es der Namespace von * Kleinbuchstaben * für die Anwendungsbenutzung ist; da Shell-Variablen und Umgebungsvariablen teilen Sie einen Namespace, nach dieser Konvention vermeidet Kollisionen. Siehe http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html) –

+0

Ich interessiere mich für den Hostnamen, und ich interessiere mich nicht für die Schlüssel. Und ich kann mehrere Einträge im JSON haben. – sudhishkr

Antwort

8

können Sie einfach: keys:

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

Und um die erste:

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

-r ist für Rohausgangssignal:

--raw-output/-r: Mit dieser Option, wenn die Das Ergebnis des Filters ist eine Zeichenkette, die dann direkt in die Standardausgabe geschrieben wird n als JSON-String mit Anführungszeichen formatiert werden. Dies kann nützlich sein, um JQ-Filter mit Nicht-JSON-basierten Systemen in Verbindung zu bringen.

Source

Wenn Sie möchten, ein bekannter Wert unterhalb einer unbekannten Eigenschaft, zB xxx.hostName:

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

Sie könnten auch erwähnen, wie man, sagen wir, eine "ipAddress" bekommen, ohne den Top-Layer-Schlüssel zu kennen. –

+0

Sie haben die richtige Idee, aber ich denke, das OP sucht tatsächlich nach 'jq -r 'keys []' my.json'. – ruakh

+0

... tatsächlich hat das OP in den Kommentaren zu der Frage geklärt: "Ich interessiere mich für den Hostnamen, und [ich] kümmern mich nicht um die Schlüssel"; also wäre es ". []. hostName" von Interesse. –