JSON 출력을 쉘스크립트 변수로 추출하려면 어떻게 해야 합니까?

JSON 출력을 쉘스크립트 변수로 추출하려면 어떻게 해야 합니까?

내가 뭘 한거지?

[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' )

이는 다음을 사용합니다. jqid배열 항목과 동일한 필드를 반환하는 간단한 쿼리를 사용하여 JSON 문서를 구문 분석합니다 .nameAdmin_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}'

관련 정보