하위 요소 값을 기반으로 json 배열 요소 추출

하위 요소 값을 기반으로 json 배열 요소 추출

다음 예제 파일이 있습니다(매우 긴 파일, 여기에 짧은 예제가 있습니다).

"request_status" : "FAILED"
{
    "href" : "http://localhost:8080/api/v1/clusters/sys41/requests/333",
    "Requests" : {
        "cluster_name" : "sys41",
        "id" : 333,
        "request_status" : "COMPLETED"
    }
},
{
    "href" : "http://localhost:8080/api/v1/clusters/sys41/requests/334",
    "Requests" : {
        "cluster_name" : "sys41",
        "id" : 334,
        "request_status" : "FAILED"
    }
},
{
    "href" : "http://localhost:8080/api/v1/clusters/sys41/requests/335",
    "Requests" : {
        "cluster_name" : "sys41",
        "id" : 335,
        "request_status" : "FAILED"
    }
},
{
    "href" : "http://localhost:8080/api/v1/clusters/sys41/requests/336",
    "Requests" : {
        "cluster_name" : "sys41",
        "id" : 336,
        "request_status" : "COMPLETED"
    }
}

일치하는 줄 뒤에 줄을 인쇄하는 방법, "id" : $num
예:

num=335 

다음 줄을 얻는 방법

"id" : $num

예상 출력

"request_status" : "FAILED"

답변1

JSON 파일이 다음과 같은 대규모 객체 배열이라고 가정합니다.

  {
    "href": "http://localhost:8080/api/v1/clusters/sys41/requests/333",
    "Requests": { "id": 333, "cluster_name": "sys41", "request_status": "COMPLETED" }
  },

(개행은 중요하지 않으며 객체의 키 순서도 중요하지 않습니다.) 그런 다음 다음 명령은 다음 에 해당하는 항목을 jq가져옵니다 .request_statusid$num

$ num=355
$ jq -r ".[].Requests | select(.id == $num).request_status" file.json
FAILED

이는 Requests각 객체와 에서 모든 항목을 선택하여 수행됩니다 id. 필터를 통과한 항목에 대해 request_status.

-rjqJSON 대신 원시 데이터를 출력 하도록 하는 옵션입니다( FAILED이 옵션이 없으면 큰따옴표로 묶입니다).


보상 자료:

$ jq -r '.[].Requests | "\(.id): \(.request_status)"' file.json
333: COMPLETED
334: FAILED
335: FAILED
336: COMPLETED

답변2

쉘 변수 num설정이 다음과 같다고 가정합니다 335.

grep -A1 "\"id\" : $num," /path/to/file

grepHandy -A, Options 에서 -B많은 도움을 받았고 -C, 제가 사용한 니모닉은 "After", "Before", "Context"였습니다.

  • grep -A n 'pattern' file표시됩니다N철사패턴 매칭 후, 라인 자체 매칭에 더해.

  • grep -C n 'pattern' file표시됩니다N철사두번째패턴 매칭 전, 라인 자체 매칭에 더해.

  • grep -C n 'pattern' file표시됩니다N앞의 두 줄그리고이후(즉문맥) 패턴 매칭, 라인 자체 매칭에 더해.

답변3

awk '/"id" : 335/{getline;print}'

또는

var="\"id\" : 335"
awk "/$var/{getline;print}"

또는

awk -v var="\"id\" : 335" '$0~var{getline;print}'

또는

var="\"id\" : 335"
awk -v var="$var" '$0~var{getline;print}'

또는 위의 항목 중 하나이지만 "id" : "문자열의 일부는 필요하지 않습니다. 형식은 다음과 같습니다.

awk -v var="335" '$0~"id" : var{getline;print}'

관련 정보