web-dev-qa-db-ja.com

Linux CLI-JSON jq + grepから部分文字列を取得する方法は?

JSONから部分文字列をプルする必要があります。以下のJSONドキュメントでは、jq '.[].networkProfile.networkInterfaces[].id'の値の終わりが必要です。つまり、別のコマンドに渡すにはA10NICvw4konls2vfbw-dataだけが必要です。 grepを使用して部分文字列をプルする方法がわからないようです。私はそこに正規表現の例があるように見えますが、それらで成功していません。

[
  {
    "id": "/subscriptions/blah/resourceGroups/IPv6v2/providers/Microsoft.Compute/virtualMachines/A10VNAvw4konls2vfbw",
    "instanceView": null,
    "licenseType": null,
    "location": "centralus",
    "name": "A10VNAvw4konls2vfbw",
    "networkProfile": {
      "networkInterfaces": [
        {
          "id": "/subscriptions/blah/resourceGroups/IPv6v2/providers/Microsoft.Network/networkInterfaces/A10NICvw4konls2vfbw-data",
          "resourceGroup": "IPv6v2"
        }
      ]
    }
  }
]
7
Adoyt

あなたの場合、*は貪欲なので、sub(".*/";"")がトリックを実行します。

.[].networkProfile.networkInterfaces[].id | sub(".*/";"")
6
peak

これを試して:

_jq -r '.[]|.networkProfile.networkInterfaces[].id | split("/") | last'
_

_-r_は、出力を「生の」形式で出力するようにJQに指示します。この場合、文字列値を二重引用符で囲むことはありません。

jq式については、必要なidにアクセスした後、split("/")を介して(まだjq内に)パイプすると、次の配列になります。スラッシュの間の部分。 last関数(ありがとう、@ Thor)を介してそれをパイプすると、配列の最後の要素だけが返されます。

4
Mark Reed

grepでそれを行いたい場合は、次の1つの方法があります。

jq -r '.[].networkProfile.networkInterfaces[].id' | grep -o '[^/]*$'

出力:

A10NICvw4konls2vfbw-data
1
Thor