[Linux] jq 명령어 알아보기

◾️ 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" }

관련 글

지식 공유3분 읽기

[Linux] Ubuntu 24.04 -> Rocky 10 마이그레이션

개요 기존 홈서버에서 운영 중인 Ubuntu 24.04 서버의 모든 서비스( Docker , Gatsby , 데이터 등등)를 새로운 Rocky 서버로 누락 없이 이관하기 위한 과정을 기록해보려고 합니다. 사전 준비 작업 전에, 양쪽...

리눅스
지식 공유3분 읽기

[Linux] 테스트 서버 디스크 장애 이슈

개요 OS : Rocky 8.10 디스크 구성 /dev/sda : 메인 디스크 /dev/sdb : 백업 디스크 상황 평소에 서버 로그에 READ sda .... , swap 관련 메시지가 간간히 보였음. 어느 날 I/O 관련 로그가...

리눅스
지식 공유1분 읽기

[Linux] SSH Keygen으로 원격 접속 키 생성하기

SSH Key 인증? SSH Key 인증은 비대칭 암호화라는 방식을 사용합니다. 한 쌍의 키(Key Pair)를 생성하여 하나는 내가 가지고 있고(개인 키, Private Key), 하나는 서버에 등록(공개 키, Public Key)...

리눅스