Linux CLI - 如何从 JSON jq + grep 获取子字符串?
Linux CLI - How to get substring from 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"
}
]
}
}
]
在你的情况下,sub(".*/";"")
可以解决问题,因为 * 是贪婪的:
.[].networkProfile.networkInterfaces[].id | sub(".*/";"")
试试这个:
jq -r '.[]|.networkProfile.networkInterfaces[].id | split("/") | last'
-r
告诉 JQ 以 "raw" 形式打印输出 - 在这种情况下,这意味着字符串值周围没有双引号。
至于 jq
表达式,在你访问你想要的 id
之后,通过 split("/")
将它(仍在 jq
内)通过管道将它变成一个数组斜线之间的部分。通过 last
函数(谢谢,@Thor)将其管道化 returns 只是数组的最后一个元素。
如果你想用 grep
做到这一点,这是一种方法:
jq -r '.[].networkProfile.networkInterfaces[].id' | grep -o '[^/]*$'
输出:
A10NICvw4konls2vfbw-data
我需要从 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"
}
]
}
}
]
在你的情况下,sub(".*/";"")
可以解决问题,因为 * 是贪婪的:
.[].networkProfile.networkInterfaces[].id | sub(".*/";"")
试试这个:
jq -r '.[]|.networkProfile.networkInterfaces[].id | split("/") | last'
-r
告诉 JQ 以 "raw" 形式打印输出 - 在这种情况下,这意味着字符串值周围没有双引号。
至于 jq
表达式,在你访问你想要的 id
之后,通过 split("/")
将它(仍在 jq
内)通过管道将它变成一个数组斜线之间的部分。通过 last
函数(谢谢,@Thor)将其管道化 returns 只是数组的最后一个元素。
如果你想用 grep
做到这一点,这是一种方法:
jq -r '.[].networkProfile.networkInterfaces[].id' | grep -o '[^/]*$'
输出:
A10NICvw4konls2vfbw-data