如何使用 awk 或 sed 从 json 对象中检索值

sub*_*odh 9 sed awk json

我有以下json

[root@mdfdevha1 ~]#  echo "$Group_ID"
[ {
  "id" : "e27206c0-aeb6-43db-acda-c4ba43233071",
  "name" : "A1",
  "path" : "/A1",
  "subGroups" : [ ]
}, {
  "id" : "89f3bd6a-33a9-4e02-9fe3-eae660c5a6cf",
  "name" : "Admin_UserGroup",
  "path" : "/Admin_UserGroup",
  "subGroups" : [ ]
}, {
  "id" : "cdc2bce5-c3bb-4b88-bdaf-d87b8bb6c644",
  "name" : "Group104",
  "path" : "/Group104",
  "subGroups" : [ ]
}, {
  "id" : "a0d749f2-ab6c-4c27-ad55-3357eaab9527",
  "name" : "Group105",
  "path" : "/Group105",
  "subGroups" : [ ]
}, {
  "id" : "fbf99c34-d50d-408b-8d19-9713f9af3e3a",
  "name" : "Group106",
  "path" : "/Group106",
  "subGroups" : [ ]
}, {
  "id" : "ebd8336f-4017-4fb1-8035-153ae1d9ba37",
  "name" : "Group201",
  "path" : "/Group201",
  "subGroups" : [ ]
}, {
  "id" : "38f4aef7-caf0-4430-9e61-1ae7026e872f",
  "name" : "Group202",
  "path" : "/Group202",
  "subGroups" : [ ]
}, {
  "id" : "436a0f4a-8b1b-4d7d-a014-fcec3513644e",
  "name" : "Group203",
  "path" : "/Group203",
  "subGroups" : [ ]
}, {
  "id" : "41962c5f-e7e9-4748-b81f-e3f1880b78de",
  "name" : "Sure_Groups",
  "path" : "/Sure_Groups",
  "subGroups" : [ {
    "id" : "593dfe69-1ed8-4649-bde4-a277166333f8",
    "name" : "Test1",
    "path" : "/Sure_Groups/Test1",
    "subGroups" : [ ]
  } ]
}, {
  "id" : "6856b69b-9113-46e1-90c6-f34548625278",
  "name" : "UG_1",
  "path" : "/UG_1",
  "subGroups" : [ ]
}, {
  "id" : "6496a0fe-b41f-4f0f-9eb9-5ef749c9130a",
  "name" : "UG_12",
  "path" : "/UG_12",
  "subGroups" : [ ]
}, {
  "id" : "71a5f5ae-bf91-4cdf-ab3c-c09ca15080d6",
  "name" : "UG_1456",
  "path" : "/UG_1456",
  "subGroups" : [ ]
}, {
  "id" : "385ea518-1d40-45f7-afcd-c0488ff02e97",
  "name" : "UG_26",
  "path" : "/UG_26",
  "subGroups" : [ {
    "id" : "a4064e3a-e2e3-47bb-99b8-9f7fadb0bc20",
    "name" : "Test1",
    "path" : "/UG_26/Test1",
    "subGroups" : [ ]
  } ]
}, {
  "id" : "9c5efedc-b901-4dcf-bbc8-8ddeaa5d84f7",
  "name" : "UG_266",
  "path" : "/UG_266",
  "subGroups" : [ ]
}, {
  "id" : "c5eb3064-752c-4f7c-b4f1-ac59f50397dd",
  "name" : "Usergroup_01",
  "path" : "/Usergroup_01",
  "subGroups" : [ ]
}, {
  "id" : "d39dc10c-558b-433e-82b4-e01a8f1d8998",
  "name" : "Usergroup_02",
  "path" : "/Usergroup_02",
  "subGroups" : [ ]
} ]
Run Code Online (Sandbox Code Playgroud)

如何使用awk 或获取特定数据sed。我需要从何处获取数据name="Admin_UserGroup"

编辑#1

感谢Hossein Vatani的回答,这里是最后的命令:

$ /opt/keycloak/bin/kcadm.sh get groups -r T0_Realm > Group.json
$ GROUP_ID_TEMP=$(grep -B1 -A0 '"name" : "Admin_UserGroup"' Group.json)
$ GROUP_ID=$(echo $GROUP_ID_TEMP | cut -d : -f2 | awk -F\" '{print $2}')
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 14

使用jq

$ printf '%s\n' "$Group_ID" | jq '.[] | select(.name == "Admin_UserGroup")'
{
  "id": "89f3bd6a-33a9-4e02-9fe3-eae660c5a6cf",
  "name": "Admin_UserGroup",
  "path": "/Admin_UserGroup",
  "subGroups": []
}
Run Code Online (Sandbox Code Playgroud)

这将选择数组中name键对应于值的所有对象Admin_UserGroup

  • JSON 是结构化数据,通过使用不了解结构的工具(awk、sed),您会冒着创建非常脆弱的正则表达式匹配的风险,并且会失败,因为它没有注意尊重 JSON 数据的结构化。 (11认同)
  • @SubodhJoshi 那么,客户端将获得不稳定的代码。 (5认同)
  • @SubodhJoshi JSON 是一种与 XML 类型相同的结构化文档格式。使用专用解析器以外的任何东西解析此类文档很容易出错。JSON 有关于如何编码和引用数据、键在哪里以及允许换行等的规则。 (5认同)
  • 对我来说 jq 不能使用,因为客户端不允许在生产环境中安装任何第三方 api (3认同)
  • @Pac0 我同意 `awk` 不限于正则表达式。我不同意 `awk` 非常适合进行 JSON 解析。 (2认同)

小智 8

根据您对基本命令的考虑,如果您的文件具有如图所示的结构,grep可能会帮助您:

$ grep -B2 -A3 '"name" : "Admin_UserGroup"' File
Run Code Online (Sandbox Code Playgroud)

但如果全部在一行中:

$ sed -E 's/\},\s*\{/\},\n\{/g' File | grep  '"name" : "Admin_UserGroup"'
Run Code Online (Sandbox Code Playgroud)

使用您的原始示例,您可以像这样使用我的解决方案:

$ echo "$Group_ID" | grep ...
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以使用 JSON.awk:

awk -f JSON.awk -v file1.json file2.json
Run Code Online (Sandbox Code Playgroud)

https://github.com/step-/JSON.awk

  • 要成为一个完整的(自包含的)答案,代码应该在答案框中,而不是链接。 (2认同)
  • 是否需要在答案中复制可以执行工作的每种工具的全部来源? (2认同)
  • @Pac0 或者,如果您的意思是作为对我评论的回复,答案应该包含必要的信息,以便有人将其带到他们的系统并使用它。系统(应该)已经安装了 `awk`,否则它一直到手写你自己的编译器都是乌龟。请参阅我们的帮助中心,了解 [为什么以及如何删除某些答案?](https://unix.stackexchange.com/help/deleted-answers) 和 [为什么我的帐户不再接受答案?](https://unix.stackexchange.com/help/deleted-answers) /unix.stackexchange.com/help/answer-bans) 两者都不鼓励仅链接的答案。 (2认同)