jq를 사용하여 JSON 배열의 특정 키가 있는 항목에서 데이터 가져오기

jq를 사용하여 JSON 배열의 특정 키가 있는 항목에서 데이터 가져오기

아래 JSON 문서에서 키에 값이 있는 email항목을 어떻게 얻 나요?level2

예상 출력은 다음과 같습니다.

[email protected]

어떤 제안이 있으십니까?

{
  "escalation_policy": {
    "on_call": [
      {
        "level": 2,
        "start": "2022-05-25T00:30:00Z",
        "end": "2022-05-25T09:30:00Z",
        "user": {
          "id": "ABOKC",
          "name": "Jaavena Dobey",
          "email": "[email protected]",
          "time_zone": "Tokyo"
        }
      },
      {
        "level": 7,
        "start": "2022-05-23T01:00:00Z",
        "end": "2022-05-30T01:00:00Z",
        "user": {
          "id": "KLSPSP",
          "name": "kosls frank",
          "email": "[email protected]",
          "time_zone": "Tokyo"
        }
      },
      {
        "level": 3,
        "start": "2022-05-23T01:00:00Z",
        "end": "2022-05-30T01:00:00Z",
        "user": {
          "id": "SKSPSLSL",
          "name": "Smitha Choudhary",
          "email": "[email protected]",
          "time_zone": "Tokyo"
        }
      }
    ]
  }
}

답변1

이와 같이,

  1. 객체 배열을 가져옵니다.
  2. 레벨 2를 선택하세요
  3. 반환된 배열에서 사용자의 이메일을 인쇄합니다.

호출 및 출력,

$ jq ".escalation_policy.on_call[] | select( .level == 2) | .user.email" test.json
"[email protected]"

답변2

다음은 통화 중인 사람들의 이메일 주소 중 하나를 가져옵니다.첫 번째통화 수준 에스컬레이션 정책은 2입니다.

jq -r '.escalation_policy.on_call | map(select(.level == 2))[0].user.email' file

이 정보를 구체적으로 요청하지는 않으셨지만 다음 내용을 통해 이름이 다음과 같은 담당자의 이메일 주소를 알 수 있습니다.가장 낮은 .level. on_call배열을 정렬하고 첫 번째 정렬된 항목의 값을 반환하여 .user.email이를 수행합니다 .

jq -r '.escalation_policy.on_call | sort_by(.level)[0].user.email' file

.start또한 현재 시간이 및 타임스탬프 내에 있는지 확인할 수도 있습니다 .end. 이를 위해 관련 대기 항목만 선택한 다음 이전과 같이 정렬합니다.

jq -r '
    .escalation_policy.on_call |
    map(select( now > (.start|fromdate) and now < (.end|fromdate) )) |
    sort_by(.level)[0].user.email' file

fromdate함수가 예상하는 것과 정확히 동일한 형식의 날짜를 가질 만큼 운이 좋기 때문에 이를 수행할 수 있습니다 jq.

관련 정보