web-dev-qa-db-ja.com

jq:オブジェクトの各エントリのキーと値を出力します

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

書式設定には興味がありません。キーの名前と値にアクセスする方法がわかりません。

45
Jeff Tang

最上位キーをストリームとして取得するには、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
72
peak

非常にエレガントなソリューションに出くわした

jq 'with_entries(.value |= .ip)'

どの出力

{
  "Host1": "10.1.2.3",
  "Host2": "10.1.2.2",
  "Host3": "10.1.18.1"
}

ここで遊ぶjqplayスニペットは次のとおりです。 https://jqplay.org/s/Jb_fnBveMQ

関数with_entriesは、オブジェクトのリスト内の各オブジェクトをキー/値ペアに変換します。したがって、それぞれ.keyまたは.valueにアクセスでき、すべてのKVアイテムを更新(上書き)します.valueフィールドで.ip更新|=演算子を使用して

21
Viacheslav