我做了什么?
[root@mdfdevha1 ~]# Group_ID=`/opt/keycloak/bin/kcadm.sh get groups -r TEST`
[root@mdfdevha1 ~]# echo $Group_ID
[ { "id" : "57c86153-11ba-4d19-aafb-9903ee00086b", "name" : "Admin_UserGroup", "path" : "/Admin_UserGroup", "subGroups" : [ ] } ]
[root@mdfdevha1 ~]# SURE_USER_ID=`echo $Group_ID | cut -d : -f2 | awk -F\" '{print $2}'`
[root@mdfdevha1 ~]# echo $SURE_USER_ID
57c86153-11ba-4d19-aafb-9903ee00086b
在这种情况下,我可以获得 id,但我的要求有点复杂,我在命令下运行
[root@mdfdevha1 ~]# Group_ID=`/opt/keycloak/bin/kcadm.sh get groups -r My_Realm`
进而
[root@mdfdevha1 ~]# echo $Group_ID
输出是 JSON 格式的多条记录
[ { "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
where name = Admin_UserGroup
。
这将如何实现?
答案1
您可以使用与 JSON 解析库捆绑在一起的语言:
echo "$Group_ID" | python -c '
import fileinput
import json
json_data = ""
for line in fileinput.input():
json_data = json_data + line
data = json.loads(json_data)
for o in data:
if o["name"] == "Admin_UserGroup":
print o["id"]
'
89f3bd6a-33a9-4e02-9fe3-eae660c5a6cf
答案2
id
的字符串可以Admin_UserGroup
是
Group_ID=$( /opt/keycloak/bin/kcadm.sh get groups -r TEST )
SURE_USER_ID=$( printf '%s' "$Group_ID" | jq -r '.[]|select(.name == "Admin_UserGroup").id' )
如果您不需要Group_ID
其他任何东西:
SURE_USER_ID=$( /opt/keycloak/bin/kcadm.sh get groups -r TEST | jq -r '.[]|select(.name == "Admin_UserGroup").id' )
这使用 jq
使用一个简单的查询来解析 JSON 文档,该查询返回等于 的id
数组条目的字段。name
Admin_UserGroup
有关的:
答案3
如果没有安装用于 json 解析的工具或库,并且您无法安装任何工具或库,或者无法使用任何便携式工具或库,如果您可以对 json 文件的格式做出一些假设(就像它总是在两边都有一个空格):
,没有转义字符,没有,{
在}
字符串值中,没有嵌套{...}
...)似乎从您的示例中可以看出:
/opt/keycloak/bin/kcadm.sh get groups -r My_Realm |
perl -l -0777 -ne 'for (/\{.*?\}/sg) {
print $1 if /"name" : "Admin_UserGroup"/ && /"id" : "(.*?)"/}'
对于更防弹的版本:
perl -l -0777 -ne 'while(m(([^{}"]++|"(?:\\.|[^\\"])*+"|
\{(?:"name"\s*:\s*("Admin_UserGroup")|"id"\s*:\s*"((?:\\.|[^\\"])*+)"|
(?1))*\}))gxs) {print $3 if $2}'