JSON 파일의 데이터를 변수로 추출하는 방법

JSON 파일의 데이터를 변수로 추출하는 방법

나는 다음과 같은 json 형식을 가지고 있습니다. 기본적으로 이는 이러한 항목이 여러 개 포함된 거대한 파일입니다.

 [
      {
        "id": "kslhe6em",
        "version": "R7.8.0.00_BNK",
        "hostname": "abacus-ap-hf-test-001:8080",
        "status": "RUNNING",
           },
      {
        "id": "2bkaiupm",
        "version": "R7.8.0.00_BNK",
        "hostname": "abacus-ap-hotfix-001:8080",
        "status": "RUNNING",
      },
      {
        "id": "rz5savbi",
        "version": "R7.8.0.00_BNK",
        "hostname": "abacus-ap-hf-test-005:8080",
        "status": "RUNNING",
          },
          
    ]

":8080" 없이 "abacus-ap-hf-test"로 시작하는 모든 호스트 이름 값을 변수로 가져온 다음 for 루프를 통해 이 값을 사용하여 아래와 같이 추가 명령을 실행하려고 합니다. 하지만 이 정보를 어떻게 추출할 수 있는지 조금 혼란스럽습니다.

HOSTAME="abacus-ap-hf-test-001 abacus-ap-hf-test-005"
for HOSTANAME in $HOSTNAME
do 
  sh ./trigger.sh
done

답변1

JSON 구문 분석 jq:

  • 모든 항목을 꺼내십시오 hostname.
  • 접두사 문자열로 필터링합니다.
  • 접미사 문자열을 제거합니다.
jq -r '.[].hostname | select(startswith("abacus-ap-hf-test")) | rtrimstr(":8080")' file

또는 동등하게,

jq -r 'map(select(.hostname|startswith("abacus-ap-hf-test")).hostname | rtrimstr(":8080"))[]' file

질문의 예제 문서의 경우(의미 없는 후행 쉼표를 제거한 후) 다음과 같은 결과가 생성됩니다.

abacus-ap-hf-test-001
abacus-ap-hf-test-005

while이는 쉘 루프에서 읽을 수 있습니다.

jq -r '.[].hostname | select(startswith("abacus-ap-hf-test")) | rtrimstr(":8080")' file |
while IFS= read -r host; do
    # do something with "$host"
done

관련 정보