jq capture - como apropriadamente digitar com string capturada

0

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.

    
por Jim 11.05.2016 / 19:22

1 resposta

2

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
    
por 11.05.2016 / 20:02