2017-01-31 3 views
0

JSON 파일을 구문 분석하고 일부 도커 컨테이너 이름과 실행중인 서버를 추출하는 스크립트를 작성하고 있습니다. 그런 다음 얻은 정보로 bash에서 다른 작업을 수행해야합니다. 나는 jq을 사용하는 것에 익숙하지만 여기까지 내가 지금까지 얻은 것이있다. 당신이 dockerConfig.dockerImageName이없는 결과에서 서비스 CONFIGS의 일부를 볼 수있는JSON j-if-then-else 문제로 구문 분석

[ 
    { 
    "dockerContainerName": null, 
    "servers": [] 
    }, 
    { 
    "dockerContainerName": "my_awesome_container", 
    "servers": [ 
     "serverX01", 
     "serverX02" 
    ] 
    }, 
... 
... 
] 

:

cat env.json | jq '[.env.service.config | .[] | {dockerContainerName:.dockerConfig.dockerImageName,servers:[.allocation[].serverName]}]' 

이 나에게의 출력을 제공합니다

나는 다음과 같은 실행합니다. dockerConfig가없는 것들을 걸러 내기 위해 되돌아 오는 것을 제한해야합니다. 나는 if-then-else를 사용해 보았지만 제대로 작동하는 것처럼 보일 수는 없다.

어떤 아이디어가 있습니까?

+1

당신이 완전한'JSON'를 제공 할 수 있습니까? 당신이 필요로하는 정확한 출력을 제공 할 수 있습니까? 현재 정보가 충분하지 않습니다. – Inian

답변

1

당신은 dockerContainerName 객체에 배열의 내용을 제한 할 select를 사용할 수는 null 다릅니다

jq '.[] | select(.dockerContainerName != null)' <<EOF 
[ 
    { 
    "dockerContainerName": null, 
    "servers": [] 
    }, 
    { 
    "dockerContainerName": "my_awesome_container", 
    "servers": [ 
     "serverX01", 
     "serverX02" 
    ] 
    } 
] 
EOF 

{ 
    "dockerContainerName": "my_awesome_container", 
    "servers": [ 
    "serverX01", 
    "serverX02" 
    ] 
} 
+0

고마워요! 내 jq 명령을 다음과 같이 수정하고 제안 된 선택을 사용하여 필터링을 제거 할 수있었습니다! 'cat env.json | jq '[.env.service.config | . [] | {dockerContainerName : .dockerConfig.dockerImageName, servers : [. 할당 []. 서버 이름]} | ('.dockerContainerName! = null)]'' – pricecreations

+0

@pricecreations nice,하지만 당신 자신의 아이템을 만들기 전에 설정을''선택 '할 수있을 것 같아요 :'jq'[.env.service.config [] | 선택 (.dockerConfig.dockerImageName! = null) | {dockerContainerName : .dockerConfig.dockerImageName, servers : [.allocation []. 서버 이름]}]' – Aaron

+0

좋은 통화! 그로 인해 성능이 향상되었습니다. – pricecreations