各パスと値を印刷したいです。JSONキー値を1行ずつ含むファイルです。次のような状況を考慮してJSONそしてジャック、各行の値も追加できますか?使用しない場合ジャック別の方法がありますか?似たようなことを考えていたsnmpwalk~のためJSON。また、私がやろうとしていることについて技術的な用語がありますか?
$ cat short.json | jq '.'
{
"Reservations": [
{
"Groups": [],
"Instances": [
{
"ImageId": "ami-a",
"InstanceId": "i-a",
"InstanceType": "t2.micro",
"KeyName": "ubuntu"
}
]
}
]
}
$ cat short.json | jq -r '[paths | map(.|tostring) | join(".")]'
[
"Reservations",
"Reservations.0",
"Reservations.0.Groups",
"Reservations.0.Instances",
"Reservations.0.Instances.0",
"Reservations.0.Instances.0.ImageId",
"Reservations.0.Instances.0.InstanceId",
"Reservations.0.Instances.0.InstanceType",
"Reservations.0.Instances.0.KeyName"
]
複数行出力の1行の例:
"Reservations.0.Instances.0.ImageId": "ami-a",
出力を次の形式でフォーマットできるとよいでしょう。ジャックコピー&ペーストを使用すると、Linux Cutを使用して値を簡単に区別できます。
'.Reservations[].Instances[].ImageId': "ami-a"
$ cat short.json | jq -r '.Reservations[].Instances[].ImageId'
ami-a
ベストアンサー1
私はこれについてよくわかりませんが、jq
インターネット上でこれを見つけて、それがあなたの場合に適用されると思います。
切り取りと貼り付けバージョン:
jq -r 'paths(scalars | true) as $p | [ ( [ $p[] | tostring ] | join(".") ), ( getpath($p) | tojson )] | join(": ")' short.json
読みやすいバージョン:
jq -r '
paths(scalars | true) as $p
| [ ( [ $p[] | tostring ] | join(".") )
, ( getpath($p) | tojson )
]
| join(": ")
' short.json
結果:
Reservations.0.Instances.0.ImageId: "ami-a"
Reservations.0.Instances.0.InstanceId: "i-a"
Reservations.0.Instances.0.InstanceType: "t2.micro"
Reservations.0.Instances.0.KeyName: "ubuntu"
ボーナスポイントが欲しいので、sed
次のトリックを使って希望の結果を得ることができます。
... | sed "s/^/\'./; s/:/\':/; s/\.0/[]/g"
任意の出力:
'.Reservations[].Instances[].ImageId': "ami-a"
'.Reservations[].Instances[].InstanceId': "i-a"
'.Reservations[].Instances[].InstanceType': "t2.micro"
'.Reservations[].Instances[].KeyName': "ubuntu"