我经常用来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"
}
}
显然,问题出在 的附加键bus
上bus
。我似乎无法弄清楚如何让捕获以返回以下结构的方式工作:
# 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