IT/Programming

jq 명령어 설치 및 사용방법 (feat. select, filter, json 필드 추가/삭제)

엘티엘 2022. 11. 10. 23:12

jq 란?

위 사진은 jq 홈페이지에서 캡처한 화면인데, 간단히 말해서 json 을 다루는 Tool 이다. Linux shell 에서 텍스트나 csv  파일을 다룰때, sed, awk 등을 사용하는데, 이처럼 json 포맷의 데이터를 다루기 편한 기능들을 모아놓은 utility 라고 생각하면 된다.

Kubernetes나 AWS 등은 resource의 상태조회시 json 포맷으로 결과가 return 된다. 이러한 결과값 중에서 원하는 attrbute만 추출하거나, 필터링하거나, csv 포맷으로 변경하는 등의 작업을 jq 로 할 수 있다.

jq 설치 (install)

download 페이지를 참고한다. 기본 명령어 (apt-get install, brew install 등) 을 사용해서 설치한다. Window라면 실행파일을 다운로드 받아 설치한다.

설치를 완료하였는데도, "command not found" 에러가 발생한다면, PATH 등록이 되어 있지 않은 경우가 대부분이다. 일반적으로 리눅스라면 설치와 같이 등록되지만, 윈도으의 경우 별도 PATH 등록이 필요하다.

jq 사용방법

사용자 메뉴얼에 잘 정리되어 있지만, 자주 쓰는 명령어(내 기준) 를 사용법을 정리해보자.

아래 json 데이터를 기본으로 사용법을 정리해 보았다. root field 는 2개의 원소를 가지고 있는 array 이다. 각 원소별로 필드와 값이 조금씩 상이하다.

{
  "root": [
    {
      "a": "aval1",
      "b": "bval1",
      "c": [
        "cval1",
        "cval11"
      ],
      "d": "dval1"
    },
    {
      "a": "aval2",
      "b": "bval2",
      "c": [
        "cval2",
        "cval22"
      ],
      "e": "eval2"
    },
    {
      "a": "aval3",
      "b": "bval3",
      "c": [
        "cval3",
        "cval33"
      ],
      "d": "dval3",
      "e": "eval3"
    }
  ]
}

json 포맷 테스트

json 이 정상적인 포맷임을 테스트해 볼수 있다. 올바르지 않은 포맷일 경우 아래와 같은 parse error가 발생한다. line을 확인하고 데이터를 수정한다.

$ jq '.' json
parse error: Invalid numeric literal at line 4, column 8

field 값 추출하기 (get value by key)

아래와 같이 입력한다. 점(.)으로 시작한다는 것에 주의하자. -r 옵션을 넣으면 쌍따옴표없이 결과가 출력된다. field가 존재하지 않는다면 null이 출력된다. 여러개의 field 를 입력하면 한줄에 하나씩 출력된다.

$ jq '.root[].a' json
"aval1"
"aval2"
"aval3"

$ jq '.root[].d' json
"dval1"
null
"dval3"

$ jq -r '.root[].b' json
bval1
bval2
bval3

$ jq '.root[]' json | jq -r '.a, .b'
aval1
bval1
aval2
bval2
aval3
bval3

원하는 field 선택하기 (select)

아래와 같이 입력한다. 점(.)으로 시작하지 않는다는 것에 주의하자. jq 에서 점(.)으로 시작하는것은 해당 field의 값(속성)을 의미한다. 이 경우 원하는 field 전체를 선택해야 하기때문에 점(.)을 입력하지 않는다.

$ jq -r '.root[]' json | jq '{a, b, d}'
{
  "a": "aval1",
  "b": "bval1",
  "d": "dval1"
}
{
  "a": "aval2",
  "b": "bval2",
  "d": null
}
{
  "a": "aval3",
  "b": "bval3",
  "d": "dval3"
}

새로운 field 추가하기

아래와 같이 입력한다. "필드명"을 직접 추가하고, 원하는 값을 넣는다. 값(속성)이기 때문에 점(.)으로 시작하는것을 주의하자.

$ jq -r '.root[]' json | jq '{"aval": .a, b, "dval": .d}'
{
  "aval": "aval1",
  "b": "bval1",
  "dval": "dval1"
}
{
  "aval": "aval2",
  "b": "bval2",
  "dval": null
}
{
  "aval": "aval3",
  "b": "bval3",
  "dval": "dval3"
}

field 삭제하기

del 함수를 사용한다.

$ jq 'del(.root[].c)' json
{
  "root": [
    {
      "a": "aval1",
      "b": "bval1",
      "d": "dval1"
    },
    {
      "a": "aval2",
      "b": "bval2",
      "e": "eval2"
    },
    {
      "a": "aval3",
      "b": "bval3",
      "d": "dval3",
      "e": "eval3"
    }
  ]
}

field 값으로 필터링 하기 (filter)

select() 를 사용한다. null 또는 원하는 값을 조건으로 입력한다.

$ jq '.root[]' json | jq 'select(.d != null)'
{
  "a": "aval1",
  "b": "bval1",
  "c": [
    "cval1",
    "cval11"
  ],
  "d": "dval1"
}
{
  "a": "aval3",
  "b": "bval3",
  "c": [
    "cval3",
    "cval33"
  ],
  "d": "dval3",
  "e": "eval3"
}

$ jq '.root[]' json | jq 'select(.d =="dval1")'
{
  "a": "aval1",
  "b": "bval1",
  "c": [
    "cval1",
    "cval11"
  ],
  "d": "dval1"
}

csv 형식으로 출력하기

경우에 따라 csv 형식으로 변경해야 하는 경우가 있다. 대괄호([]) 와 @csv 를 사용한다. -r 옵션을 넣지 않으면 쌍따옴표 앞에 역슬레시(/)가 출력된다.

$ jq '.root[]' json | jq -r '[.a, .b] | @csv'
"aval1","bval1"
"aval2","bval2"
"aval3","bval3"

 

 

반응형

'IT > Programming' 카테고리의 다른 글

Tail Recursion(꼬리 재귀)란?  (0) 2021.01.11
파이썬 REPL 이란?  (0) 2021.01.11