else in jq가 예상한 출력을 제공하지 않는 경우

else in jq가 예상한 출력을 제공하지 않는 경우

사용자의 필드가 내부 필드인 경우 해당 필드를 표시해야 합니다.

입력하다:

[
  {
    "name": "A_A",
    "uri": "https:test/test",
    "realm": "internal"
  },
  {
    "name": "B_B",
    "uri": "https:test/test",
    "realm": "internal"
  },
  {
    "name": "C_C",
    "uri": "https:test/test",
    "realm": "external"
  }
]

시험을 마친:

jq 'if .[].realm == "internal" then .[].name else empty end'

하지만 문제는 모든 사용자를 나열한다는 것입니다.

예상 출력:

A_A , B_B

답변1

jq 함수를 사용할 수 있습니다 select.

<file jq -r '.[] | select(.realm == "internal") | .name'

첫 번째는 .[]배열 요소를 가져옵니다. select()올바른 요소가 포함된 개별 요소 및 필터에 적용됩니다 realm. 마지막 부분은 name필드를 인쇄합니다.

답변2

조건을 걸어야지뒤쪽에테스트할 단일 프로젝트를 반복합니다.

jq '.[]| (if .realm == "internal" then .name else empty end)'

답변3

@csv사용자가 CSV 형식의 출력을 원하는 것 같으므로 jq.

이 명령은 입력 배열의 각 요소에 명령문을 map()적용하는 데에도 사용됩니다 .select()

$ jq -r 'map(select(.realm == "internal").name)|@csv' file
"A_A","B_B"

이는 키 값을 기반으로 관련 배열 항목을 선택한 다음 여기에서 키 값을 추출하여 realm문제를 해결했음을 보여줍니다. 그러면 단일 CSV 레코드로 형식이 지정되고 출력되는 값 name배열이 남게 됩니다 .name@csv

관련 정보