jq capture - 如何正确使用捕获的字符串进行键入

jq capture - 如何正确使用捕获的字符串进行键入

我经常用来lshw -json抽象 Linux 主机上的系统数据。在当前场景中,我已经通过 lshw 从 lshw 提取了网络数据lshw -c network -json,并且需要进一步提取有关计算机上的 NIC 的数据。

复制我所在的位置:

# lshw -c network -json > /var/tmp/network.json

pci@现在,我需要一个 JSON 结构,它仅封装总线信息已从字符串中删除的网络接口的 id 和逻辑名称。这让我很接近:

# jq '.[] | {id: .logicalname, bus: .businfo | capture("pci@(?<bus>.*)")}' /var/tmp/network.json
{
  "id": "eth0",
  "bus": {
    "bus": "0000:01:00.0"
  }
}
{
  "id": "eth1",
  "bus": {
    "bus": "0000:01:00.1"
  }
}
{
  "id": "eth2",
  "bus": {
    "bus": "0000:01:00.2"
  }
}
{
  "id": "eth3",
  "bus": {
    "bus": "0000:01:00.3"
  }
}

显然,问题出在 的附加键busbus。我似乎无法弄清楚如何让捕获以返回以下结构的方式工作:

# jq '.[] | {id: .logicalname, bus: .businfo | capture("pci@(?<bus>.*)")}' /var/tmp/network.json
{
  "id": "eth0",
  "bus": "0000:01:00.0"
}
{
  "id": "eth1",
  "bus": "0000:01:00.1"
}
{
  "id": "eth2",
  "bus": "0000:01:00.2"
}
{
  "id": "eth3",
  "bus": "0000:01:00.3"
}

有jq高手吗?我发现 jq 文档稍微缺乏这样的用例。

答案1

我不知道如何实现这一点capture,但你可以使用sub

jq '.[] | {id: .logicalname, bus: .businfo | sub("pci@"; "")}' /var/tmp/network.json

相关内容