◾️ 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
json이 올바른 포맷이 아니라면 아래와 같은 parse error
가 발생할 수 있다.
문제되는 line을 확인하고 데이터를 수정해주도록 하자.
jq '.' test.json
parse error: Invalid numeric literal at line 12, column 0
• 필드 값 추출
아래와 같이 입력해보자. 점(.
)으로 시작한다는 것에 주의
jq '.blog[].title' test.json
-r
옵션을 넣으면 쌍따옴표 없이 결과가 출력된다.
(만약 filed가 존재하지 않을 시 null
이 출력됨)
jq -r '.blog[].date' test.json
여러 개의 field를 입력하면 한 줄에 하나씩 출력된다.
jq '.blog[]' test.json | jq -r '.title, .author'
• 원하는 필드 선택
점(.
)으로 시작하지 않는 것에 주의하자.
jq
에서 점(.
)으로 시작하는 것은 해당 filed의 값(속성)을 의미한다.
이번 예제의 경우 원하는 filed 전체를 선택해야 하기 때문에 점(.
)을 입력하지 않는다.
jq -r '.blog[]' test.json | jq -r '{title,date,author}'
• 새로운 필드 추가
"필드명"을 직접 추가하고, 원하는 값을 넣는다. 값(속성)이기 때문에 점(.
)으로 시작하는 것을 주의하자.
jq -r '.blog[]' test.json | jq '{"category": "IT", "tags": "리눅스 명령어"}'
• 필드 값으로 필터링
select()
를 사용한다. null 또는 원하는 값을 조건으로 입력한다.
jq '.blog[]' test.json | jq 'select(.title != "jq 명령어 사용 방법")'
jq '.blog[]' test.json | jq 'select(.date == "2023-08-23")'
• csv 형식으로 출력
경우에 따라 csv 형식으로 변경해야 할 수도 있다.
대괄호([]
)와 @csv
를 사용한다.
-r
옵션을 넣지 않으면 쌍따옴표 앞에 역슬래쉬(/
)가 출력된다.
jq '.blog[]' test.json | jq -r '[.title, .author] | @csv'
• --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" }