Profile picture

[Linux] jq 명령어 알아보기

JaehyoJJAng2023년 07월 08일

◾️ jq


jq는 JSON을 유용하게 다룰 수 있는 Tool이다.

리눅스에서는 텍스트나 csv 파일 등을 다룰때 sed, awk 등의 명령어를 자주 사용하는데, 이처럼 JSON 포맷의 데이터를 다루기 위한 편한 기능들을 모아놓은 도구라고 생각하면 된다.


▪️ jq 설치

jq 다운로드페이지에서 배포판 별로 자세한 설치 방법이 나와있다.

Windows라면 실행 파일을 다운로드 받아 설치하도록 하자.


▪️ 사용 방법

아래의 JSON 데이터를 기반으로 여러 예제들을 실습해볼 것이다.

{
  "blog": [
    {
      "title": "jq 명령어 사용 방법",
      "date": "2023-08-23",
      "author": "waytothem"
    },

    {
      "title": "jq 실습",
      "date": "2023-08-24",
      "author": "waytothem"
    },

    {
      "title": "리눅스 프로젝트",
      "date": "2023-10-24",
      "author": "waytothem"
    }
  ]
}

• 포맷 테스트

json 포맷이 올바르다면 아래와 같은 출력이 나올 것이다.

jq '.' test.json

image


json이 올바른 포맷이 아니라면 아래와 같은 parse error가 발생할 수 있다.
문제되는 line을 확인하고 데이터를 수정해주도록 하자.

jq '.' test.json
parse error: Invalid numeric literal at line 12, column 0

• 필드 값 추출

아래와 같이 입력해보자. 점(.)으로 시작한다는 것에 주의

jq '.blog[].title' test.json

image


-r 옵션을 넣으면 쌍따옴표 없이 결과가 출력된다.
(만약 filed가 존재하지 않을 시 null이 출력됨)

jq -r '.blog[].date' test.json

image


여러 개의 field를 입력하면 한 줄에 하나씩 출력된다.

jq '.blog[]' test.json | jq -r '.title, .author'

image


• 원하는 필드 선택

점(.)으로 시작하지 않는 것에 주의하자.

jq에서 점(.)으로 시작하는 것은 해당 filed의 값(속성)을 의미한다.

이번 예제의 경우 원하는 filed 전체를 선택해야 하기 때문에 점(.)을 입력하지 않는다.

jq -r '.blog[]' test.json | jq -r '{title,date,author}'

image


• 새로운 필드 추가

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

jq -r '.blog[]' test.json | jq '{"category": "IT", "tags": "리눅스 명령어"}'

image


• 필드 값으로 필터링

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

jq '.blog[]' test.json | jq 'select(.title != "jq 명령어 사용 방법")'

jq '.blog[]' test.json | jq 'select(.date == "2023-08-23")'

image


• csv 형식으로 출력

경우에 따라 csv 형식으로 변경해야 할 수도 있다.
대괄호([])와 @csv를 사용한다.

-r 옵션을 넣지 않으면 쌍따옴표 앞에 역슬래쉬(/)가 출력된다.

jq '.blog[]' test.json | jq -r '[.title, .author] | @csv'

image


• --arg 옵션

--arg 옵션은 jq에서 사용되는 옵션 중 하나로, 변수를 정의하고 이를 JSON 데이터 안에서 참조할 때 사용된다.

이 옵션을 사용하면 jq 스크립트에서 외부 변수를 전달하여 JSON 데이터를 동적으로 생성하거나 조작할 수 있다.

# 변수 name을 정의하고 JSON 데이터 안에서 이를 참조하여 출력
name="John"
jq --arg name "$name" '{ "name": $name }'
# 변수를 정의하고 JSON 데이터 안에서 이를 참조하여 출력
# 숫자형 변수의 경우 --argjson 사용
name="John"
age=30
jq --arg name "$name" --argjson age "$age" '{ "name": "$name", "age": "$age" }

Loading script...