jq 캡처 - 캡처된 문자열을 입력에 올바르게 사용하는 방법

jq 캡처 - 캡처된 문자열을 입력에 올바르게 사용하는 방법

저는 종종 이를 lshw -jsonLinux 호스트의 시스템 데이터를 추상화하는 데 사용합니다. 현재 시나리오에서는 이미 lshw를 통해 lshw에서 네트워크 데이터를 추출했으며 lshw -c network -json머신의 NIC에 대한 데이터를 추가로 추출해야 합니다.

내 위치 복사:

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

pci@이제 문자열에서 버스 정보가 제거된 네트워크 인터페이스의 ID와 논리적 이름만 캡슐화하는 JSON 구조가 필요합니다. 이것은 나를 꽤 가깝게 만듭니다.

# 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

관련 정보