如何打印 JSON 文件的路径和键值

moj*_*joa 7 json jq

我想逐行打印包含键值的文件的每个路径和值。鉴于以下,是否还可以为每一行添加值?如果不使用还有另一种方法吗?我想到的依稀相似的东西。另外,我正在尝试做的事情是否有技术术语?

$ 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"
]
Run Code Online (Sandbox Code Playgroud)

多行输出中的单行示例:
"Reservations.0.Instances.0.ImageId": "ami-a",

如果可以使用复制和粘贴将输出格式化为在使用,并且使用 linux cut 轻松分离值,则奖励:

'.Reservations[].Instances[].ImageId': "ami-a" 
Run Code Online (Sandbox Code Playgroud)
$ cat short.json | jq -r '.Reservations[].Instances[].ImageId'
ami-a
Run Code Online (Sandbox Code Playgroud)

use*_*469 6

我不是很了解,jq但我在互联网上发现了这个,我认为它适用于你的情况:

剪切和粘贴版本:

jq -r 'paths(scalars) as $p  | [ ( [ $p[] | tostring ] | join(".") ), ( getpath($p) | tojson )] | join(": ")' short.json 
Run Code Online (Sandbox Code Playgroud)

易于(er)阅读版本:

jq -r '
paths(scalars) as $p
  | [ ( [ $p[] | tostring ] | join(".") )
    , ( getpath($p) | tojson )
    ]
  | join(": ")
' short.json
Run Code Online (Sandbox Code Playgroud)

结果:

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"
Run Code Online (Sandbox Code Playgroud)

因为我想要加分,这里有一个 hackysed你可以添加以获得你想要的输出:

... | sed "s/^/\'./; s/:/\':/; s/\.0/[]/g"
Run Code Online (Sandbox Code Playgroud)

哪些输出:

'.Reservations[].Instances[].ImageId': "ami-a"
'.Reservations[].Instances[].InstanceId': "i-a"
'.Reservations[].Instances[].InstanceType': "t2.micro"
'.Reservations[].Instances[].KeyName': "ubuntu"
Run Code Online (Sandbox Code Playgroud)