Eu não sei como conseguir isso com capture
, mas você pode usar sub
:
jq '.[] | {id: .logicalname, bus: .businfo | sub("pci@"; "")}' /var/tmp/network.json
Eu uso rotineiramente lshw -json
para abstrair dados do sistema em hosts Linux. No cenário atual, eu extraí dados de rede do lshw via lshw -c network -json
e tenho necessidade de extrair mais dados sobre a NIC na máquina.
Para duplicar onde estou:
# lshw -c network -json > /var/tmp/network.json
Agora, preciso de uma estrutura JSON que encapsule apenas o id e o nome lógico da interface de rede na qual o businfo possui pci@
removido da string. Isso me deixa perto:
# 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"
}
}
Obviamente, o problema é o bus
to bus
codificado adicionalmente. Eu não consigo descobrir como fazer com que a captura funcione de maneira a retornar a seguinte estrutura:
# 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"
}
Algum guru jq por aí? Eu acho que a documentação do jq tem pouca falta para casos de uso como este.
Tags shell-script jq