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

関連情報