【问题标题】:Linux CLI - How to get substring from JSON jq + grep?Linux CLI - 如何从 JSON jq + grep 获取子字符串?
【发布时间】:2017-09-21 13:12:05
【问题描述】:

我需要从 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"
        }
      ]
    }
  }
]

【问题讨论】:

    标签: json bash grep jq pathname


    【解决方案1】:

    在您的情况下,sub(".*/";"") 会解决问题,因为 * 是贪婪的:

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

    【讨论】:

      【解决方案2】:

      试试这个:

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

      -r 告诉 JQ 以“原始”形式打印输出 - 在这种情况下,这意味着字符串值周围没有双引号。

      对于jq 表达式,在您访问所需的id 后,通过split("/") 将其管道(仍在jq 内)将其转换为斜线之间的部分数组。通过last 函数(谢谢@Thor)将其传递给数组的最后一个元素。

      【讨论】:

      • .[] | .networkProfile.networkInterfaces[].id | split("/") | last
      【解决方案3】:

      如果你想用grep 来做这件事,这是一种方法:

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

      输出:

      A10NICvw4konls2vfbw-data
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-30
        相关资源
        最近更新 更多