나는 다음과 같은 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