web-dev-qa-db-ja.com

「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 $KEYSjqを使用してそれを実行しようとしています。

私が試したこと:| jq .KEYSは、私が頻繁に使用するコマンドです。

Jsonのすべての主キーを表示するjqコマンドはありますか?

私はhostnameフィールドのみを気にします。そして、それを抽出したいと思います。私はgrepを使用してそれを行う方法を知っていますが、それはクリーンなアプローチではありません。

19
sudhishkr

単に使用できます:keys

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

そして、最初のものを得るために:

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

-rは生の出力用です。

--raw-output / -r:このオプションを使用すると、フィルターの結果が文字列の場合、引用符付きのJSON文字列としてフォーマットされるのではなく、標準出力に直接書き込まれます。これは、jqフィルターを非JSONベースのシステムと通信させる場合に役立ちます。

ソース

不明なプロパティの下に既知の値が必要な場合、たとえばxxx.hostName

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