2017-05-11 2 views
1

jq에서 y를 기반으로 한 x의 값을 얻습니다. name을 기준으로 DATABASES_DEFAULT의 값을 얻으려고 시도하면 전체적으로 많은 숫자가 name이고 json 파일은 완전히 손실됩니다.jq 복잡한 json 파일

내 파일은 다음과 같이 표시됩니다 (aws ecs describe-task-definition의 출력). 나는 구조를 그대로 유지할 수있는 가장 기초적인 예제로 이것을 제거했다.

{ 
    "taskDefinition": { 
     "status": "bar", 
     "family": "bar2", 
     "volumes": [], 
     "taskDefinitionArn": "bar3", 
     "containerDefinitions": [ 
      { 
       "dnsSearchDomains": [], 
       "environment": [ 
        { 
         "name": "bar4", 
         "value": "bar5" 
        }, 
        { 
         "name": "bar6", 
         "value": "bar7" 
        }, 
        { 
         "name": "DATABASES_DEFAULT", 
         "value": "foo" 
        } 
       ], 
       "name": "baz", 
       "links": [] 
      }, 
      { 
       "dnsSearchDomains": [], 
       "environment": [ 
        { 
         "name": "bar4", 
         "value": "bar5" 
        }, 
        { 
         "name": "bar6", 
         "value": "bar7" 
        }, 
        { 
         "name": "DATABASES_DEFAULT", 
         "value": "foo2" 
        } 
       ], 
       "name": "boo", 
       "links": [] 
      } 
     ], 
     "revision": 1 
    } 
} 

은 내가 namebaz입니다 DATABASES_DEFAULT의 값이 필요합니다. name 키가 많이 있는데, 특별히 environment 외부의 키 쌍에 대해 이야기하고 있습니다.

저는이 문제를 해결하기 위해 노력해 왔지만 중첩 된 값에 액세스하는 방법을 이해하지 못한다는 것을 깨닫기 전에이 문제를 해결했습니다. 분명히이가) 작동하지 않습니다

jq: error: DATABASES_DEFAULT/0 is not defined at <top-level>, line 1: 
.[] | select(.name==DATABASES_DEFAULT) | .value 
jq: 1 compile error 

를 반환하고, B)는 않았더라도, 그것은 name 값의 독립적입니다됩니다

jq '.[] | select(.name==DATABASES_DEFAULT) | .value' 

. 내 생각은 db 기본값을 모두 반환 한 다음 baz를 사용하여 그 값을 확인하는 것이지만 올바른 방법인지는 모르겠습니다.

+0

'는 리터럴 문자열이 아닌 키 이름이나 함수로 DATABASES_DEFAULT'는 따옴표에 있어야합니다. – chepner

답변

2

난 당신이 외부 층을 열 때문에 먼저 구조로 아래로 파고로 그것을 생각하고 싶다 :

select(.name =="baz") 

열기 :

.taskDefinition.containerDefinitions[] 

지금 당신이 원하는 하나를 선택 내부 구조 :

.environment[] 

Se

.value 

함께 촬영 :

.taskDefinition.containerDefinitions[] | 
select(.name =="baz")     | 
.environment[]       | 
select(.name == "DATABASES_DEFAULT") | 
.value 

실행을이 같은

parse.jq :

원하는 키를 선택

select(.name == "DATABASES_DEFAULT") 

: 원하는 객체를 lect

<infile jq -f parse.jq 

출력 :

"foo" 
+0

자세한 설명을 위해 +2를 할 수 있다면 감사하겠습니다. – Alex

1

다음은 작동하는 것 같다 :

.taskDefinition.containerDefinitions[] | 
    select(
    select(
    .environment[] | .name == "DATABASES_DEFAULT" 
    ).name == "baz" 
) 

출력은 "바즈"에 매핑 된 name 키를 사용하여 객체입니다.

$ jq '.taskDefinition.containerDefinitions[] | select(select(.environment[]|.name == "DATABASES_DEFAULT").name=="baz")' tmp.json 
{ 
    "dnsSearchDomains": [], 
    "environment": [ 
    { 
     "name": "bar4", 
     "value": "bar5" 
    }, 
    { 
     "name": "bar6", 
     "value": "bar7" 
    }, 
    { 
     "name": "DATABASES_DEFAULT", 
     "value": "foo" 
    } 
    ], 
    "name": "baz", 
    "links": [] 
}