使用嵌套对象解析 json 文件

时间:2021-01-27 17:35:45

标签: json linux parsing jq

我想请你帮忙。

我正在与“jq”解析器作斗争,但没有想法。我只需要从给定的 json 文件中提取所需的行。

这是我的文件:

{
  "SystemInventory": {
    "BIOS": [
      {
        "BIOSReleaseDate": "11/12/2020",
        "FQDD": "BIOS.Setup.1-1",
        "SMBIOSPresent": "True",
        "VersionString": "2.10.0"
      }
    ],
    "CPU": [
      {
        "CPUFamily": "Intel(R) Xeon(TM)",
        "Characteristics": "64-bit capable",
        "CurrentClockSpeed": "2.2 GHz",
        "DeviceDescription": "CPU 1"
      },
      {
        "CPUFamily": "Intel(R) Xeon(TM)",
        "Characteristics": "64-bit capable",
        "CurrentClockSpeed": "2.2 GHz",
        "DeviceDescription": "CPU 2"
      }
    ],
    "iDRACNIC": [
      {
        "IPv4Address": "6.6.16.16",
        "NICDuplex": "Full",
        "NICEnabled": "Enabled",
        "NICSpeed": "100",
        "PermanentMACAddress": "5c:d8:8f:1e:51:ce"
      }
    ]
  }
}

比方说,我只需要一些行,我希望输出如下:

"BIOSReleaseDate": "11/12/2020"
"VersionString": "2.10.0"
"CPUFamily": "Intel(R) Xeon(TM)"
"DeviceDescription": "CPU 1"
"DeviceDescription": "CPU 2"
"IPv4Address": "6.6.16.16"
"NICSpeed": "100"

我用“jq”解析器尝试过,但是当涉及到嵌套对象时,我没有想法。 有没有办法通过 jq 实现这一点?

我将不胜感激..

非常感谢

以下方法如何根据您的输入解析特定行,对我来说似乎更方便:

cat data.json | jq '.SystemInventory.BIOS[0] | {BIOS: .VersionString}'
{
  "BIOS": "2.10.0"
}

cat data.json | jq '.SystemInventory.iDRACNIC[0] | {IP: .IPv4Address}'
{
  "IP": "6.6.16.16"
}

有没有办法在一个命令中实现这一目标? 提前致谢!

2 个答案:

答案 0 :(得分:0)

对于您的示例,以下调用会根据我认为的要求生成如下所示的输出,尽管输出与问题中显示的内容略有不同:

jq -r -f program.jq myfile.json

其中 program.jq 包含:

.SystemInventory[][]
| {BIOSReleaseDate, VersionString, CPUFamily, DeviceDescription, IPv4Address, NICSpeed}
| to_entries[]
| select(.value != null)
| "\"\(.key)\": \"\(.value)\""

输出

"BIOSReleaseDate": "11/12/2020"
"VersionString": "2.10.0"
"CPUFamily": "Intel(R) Xeon(TM)"
"DeviceDescription": "CPU 1"
"CPUFamily": "Intel(R) Xeon(TM)"
"DeviceDescription": "CPU 2"
"IPv4Address": "6.6.16.16"
"NICSpeed": "100"

答案 1 :(得分:0)

jq '.SystemInventory.BIOS[0].BIOSReleaseDate' 似乎没问题,但我只会得到一行,以及如何与其他行结合,例如jq '.SystemInventory.iDRACNIC[0].IPv4Address' 所以我会得到两行作为输出?? 谢谢