◾️ 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.jsonjson이 올바른 포맷이 아니라면 아래와 같은 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" }