1. ホーム
  2. json

[解決済み] jq: オブジェクトの各エントリについてキーと値を表示する

2022-09-14 09:26:55

質問

どうすれば jq を使ってこんな風にjsonを取ることができます。

{
  "host1": { "ip": "10.1.2.3" },
  "host2": { "ip": "10.1.2.2" },
  "host3": { "ip": "10.1.18.1" }
}

と入力し、このような出力を生成します。

host1, 10.1.2.3
host2, 10.1.2.2
host3, 10.1.18.1

書式に興味はないのですが、キー名と値にアクセスする方法がわからないのです。

どのように解決するのですか?

トップレベルのキーをストリームとして取得するためには 組み込み関数 keys[] . ですから、あなたの特定の問題に対する1つの解決策は、次のようになります。

jq -r 'keys[] as $k | "\($k), \(.[$k] | .ip)"' 

keys はキー名をソートした状態で出力します。 keys_unsorted .

元の順序でキーを生成する、もう一つの代替案は、次のとおりです。

jq -r 'to_entries[] | "\(.key), \(.value | .ip)"'

CSV、TSV出力

ここで、@csvと@tsvのフィルタも検討する価値があるかもしれません、例えば

jq -r 'to_entries[] | [.key, .value.ip] | @tsv'

を生成します。

host1   10.1.2.3
host2   10.1.2.2
host3   10.1.18.1

埋め込みオブジェクト

次の例のように、関心のあるキーが埋め込まれている場合、jqフィルターは示された線に沿って修正されなければならないでしょう。

入力

{
  "myhosts": {
    "host1": { "ip": "10.1.2.3" },
    "host2": { "ip": "10.1.2.2" },
    "host3": { "ip": "10.1.18.1" }
  }
}

修正する。

jq -r '.myhosts | keys[] as $k | "\($k), \(.[$k] | .ip)"'