jq
개요
jq는 명령줄 인터페이스(CLI) 환경에서 JSON(JavaScript Object Notation) 데이터를 처리, 필터링, 변형하기 위한 경량적이고 유연한 명령줄 JSON 프로세서입니다.
현대적인 소프트웨어 개발 환경에서 REST API의 응답 값이나 설정 파일, 로그 데이터 등이 대부분 JSON 형식을 취함에 따라, 텍스트 기반의 쉘 환경에서 복잡한 JSON 구조를 효율적으로 파싱하고 원하는 데이터만 추출하기 위한 필수적인 도구로 자리 잡았습니다. jq는 단순한 텍스트 검색 도구인 grep이나 sed와 달리 JSON의 계층 구조를 이해하고 처리하는 전용 문법을 제공합니다.
설치 및 기본 사용법
운영체제별 설치 방법
jq는 대부분의 주요 운영체제 패키지 관리자를 통해 설치할 수 있습니다.
| 운영체제 |
설치 명령어 |
| macOS |
brew install jq |
| Ubuntu/Debian |
sudo apt-get install jq |
| CentOS/RHEL |
sudo yum install jq |
| Windows |
choco install jq 또는 scoop install jq |
기본 실행 구문
jq의 기본 실행 구조는 다음과 같습니다.
단순 출력 예제:
data.json 파일의 내용이 {"name": "Alice", "age": 25}일 때, 전체 내용을 예쁘게 출력(Pretty-print)하려면 마침표(.) 필터를 사용합니다.
핵심 필터 및 문법
데이터 추출 및 처리 원리
jq는 필터(Filter)라는 개념을 사용하여 데이터를 처리합니다. 필터는 입력 데이터를 받아 변형한 뒤 출력하는 함수와 같습니다.
- 점 표기법 (
.): 루트 객체를 의미하며, .key 형태로 특정 키의 값에 접근합니다.
- 배열 처리 (
[]): 배열의 모든 요소를 개별적으로 출력하거나, .[0]과 같이 인덱스로 접근합니다.
- 파이프라인 (
|): 앞선 필터의 출력 결과를 다음 필터의 입력으로 전달합니다. 이는 유닉스 쉘의 파이프와 유사한 동작 방식입니다.
주요 연산자 및 필터 요약
| 연산자/함수 |
설명 |
예시 |
결과 |
. |
루트 객체 전체 출력 |
jq '.' |
전체 JSON 출력 |
.key |
특정 키의 값 추출 |
jq '.name' |
"Alice" |
.[] |
배열의 모든 요소 전개 |
jq '.items[]' |
배열 내 각 객체 출력 |
.[index] |
배열의 특정 인덱스 접근 |
jq '.items[0]' |
첫 번째 요소 출력 |
| |
필터 체이닝 (결과 전달) |
jq '.items[] | .name' |
모든 아이템의 이름만 추출 |
slice |
배열의 일부 구간 추출 |
jq '.items[0:2]' |
0번부터 1번 인덱스까지 추출 |
고급 기능 및 함수
제어문 및 내장 함수
단순 추출을 넘어 데이터를 가공하기 위해 다음과 같은 고급 기능을 제공합니다.
select(condition): 조건에 맞는 요소만 필터링합니다.
- 예:
jq '.[] | select(.age > 20)' (나이가 20 초과인 요소만 추출)
map(filter): 배열의 모든 요소에 특정 필터를 적용하여 새로운 배열을 생성합니다.
- 예:
jq 'map(.name)' (객체 배열에서 이름만 추출하여 새로운 배열 생성)
keys: 객체의 모든 키를 배열 형태로 반환합니다.
length: 배열의 길이, 문자열의 길이, 또는 객체의 키 개수를 반환합니다.
if-then-else: 조건부 로직을 구현합니다.
- 문자열 보간법 (
\(expression)): 문자열 내에 \( )를 사용하여 변수나 필터의 결과값을 삽입할 수 있습니다. (예: "Hello, \(.name)!")
실전 복잡 쿼리 예제
다음과 같은 JSON 데이터(users.json)가 있다고 가정합니다.
[
{"id": 1, "name": "Kim", "role": "admin", "tags": ["dev", "ops"]},
{"id": 2, "name": "Lee", "role": "user", "tags": ["design"]},
{"id": 3, "name": "Park", "role": "admin", "tags": ["dev", "security"]}
]
요구사항: 역할이 'admin'인 사용자들의 이름만 추출하여 새로운 배열로 만들기
jq '[ .[] | select(.role == "admin") | .name ]' users.json
# 결과: ["Kim", "Park"]
실무 활용 사례
API 응답 값 파싱
curl 명령어로 받은 JSON 응답에서 특정 값만 추출하여 쉘 변수에 할당하는 방식이 가장 흔하게 사용됩니다. 이때 -r (raw-output) 옵션을 사용하지 않으면 결과값에 쌍따옴표(")가 포함되어 쉘 변수 활용 시 오류가 발생할 수 있으므로 주의해야 합니다.
# GitHub API를 통해 특정 저장소의 Star 개수 추출 (-r 옵션으로 따옴표 제거)
STAR_COUNT=$(curl -s https://api.github.com/repos/jqlang/jq | jq -r '.stargazers_count')
echo "This repo has $STAR_COUNT stars."
로그 파일 분석 및 변형
JSON 형식의 로그 파일에서 에러 레벨이 "ERROR"인 로그의 메시지와 타임스탬프만 추출하여 텍스트 파일로 저장하는 사례입니다.
cat app.log | jq -r '.[] | select(.level == "ERROR") | "\(.timestamp) - \(.message)"' > error_report.txt
JSON 입력 방식별 차이점
jq는 다양한 방식으로 데이터를 입력받을 수 있으며, 입력 방식에 따라 처리 흐름이 달라집니다.
| 입력 방식 |
명령어 예시 |
특징 |
| 파일 입력 |
jq '.' file.json |
파일 시스템에서 직접 읽어 처리하며 대용량 파일에 적합함 |
| 표준 입력 (stdin) |
cat file.json | jq '.' |
다른 명령어의 출력을 파이프로 받아 처리하는 전형적인 유닉스 방식 |
| 문자열 입력 |
echo '{"a":1}' | jq '.' |
짧은 JSON 문자열을 즉석에서 테스트할 때 유용함 |
| 여러 파일 입력 |
jq '.' a.json b.json |
여러 파일을 순차적으로 읽어 각각 필터를 적용함 |
성능 최적화 및 팁
자주 쓰이는 옵션 요약
| 옵션 |
긴 이름 |
설명 |
-r |
--raw-output |
출력값의 따옴표를 제거하고 원시 문자열(raw string)로 출력. 쉘 스크립트 연동 시 필수적임 |
-c |
--compact-output |
줄바꿈 없이 한 줄로 압축하여 출력 (로그 저장 시 유리) |
-S |
--sort-keys |
객체의 키를 알파벳 순으로 정렬하여 출력 |
-s |
--slurp |
입력된 여러 JSON 객체를 하나의 큰 배열로 묶어서 처리 |
대용량 파일 처리 주의점
jq는 기본적으로 입력 데이터를 메모리에 로드하여 처리합니다. 수 GB 단위의 매우 큰 JSON 파일을 처리할 때 메모리 부족 현상이 발생할 수 있습니다. 이 경우 다음과 같은 전략을 권장합니다.
--stream 옵션: 데이터를 스트리밍 방식으로 처리하여 메모리 사용량을 최소화합니다. 다만, 일반 필터와 문법이 완전히 다르며 매우 복잡하므로, 사용 전 공식 문서의 Streaming 섹션을 반드시 참조하십시오.
- 예시:
jq --stream 'select(.[0][0] == "key")' large.json
split 활용: 파일을 적절한 크기로 나누어 처리합니다.
참고 문헌 및 링크
# jq
## 개요
`jq`는 명령줄 인터페이스(CLI) 환경에서 JSON(JavaScript Object Notation) 데이터를 처리, 필터링, 변형하기 위한 경량적이고 유연한 명령줄 JSON 프로세서입니다.
현대적인 소프트웨어 개발 환경에서 REST API의 응답 값이나 설정 파일, 로그 데이터 등이 대부분 JSON 형식을 취함에 따라, 텍스트 기반의 쉘 환경에서 복잡한 JSON 구조를 효율적으로 파싱하고 원하는 데이터만 추출하기 위한 필수적인 도구로 자리 잡았습니다. `jq`는 단순한 텍스트 검색 도구인 `grep`이나 `sed`와 달리 JSON의 계층 구조를 이해하고 처리하는 전용 문법을 제공합니다.
## 설치 및 기본 사용법
### 운영체제별 설치 방법
`jq`는 대부분의 주요 운영체제 패키지 관리자를 통해 설치할 수 있습니다.
| 운영체제 | 설치 명령어 |
| :--- | :--- |
| **macOS** | `brew install jq` |
| **Ubuntu/Debian** | `sudo apt-get install jq` |
| **CentOS/RHEL** | `sudo yum install jq` |
| **Windows** | `choco install jq` 또는 `scoop install jq` |
### 기본 실행 구문
`jq`의 기본 실행 구조는 다음과 같습니다.
```bash
jq '[필터]' [파일명 또는 입력값]
```
**단순 출력 예제:**
`data.json` 파일의 내용이 `{"name": "Alice", "age": 25}`일 때, 전체 내용을 예쁘게 출력(Pretty-print)하려면 마침표(`.`) 필터를 사용합니다.
```bash
jq '.' data.json
```
## 핵심 필터 및 문법
### 데이터 추출 및 처리 원리
`jq`는 **필터(Filter)**라는 개념을 사용하여 데이터를 처리합니다. 필터는 입력 데이터를 받아 변형한 뒤 출력하는 함수와 같습니다.
- **점 표기법 (`.`):** 루트 객체를 의미하며, `.key` 형태로 특정 키의 값에 접근합니다.
- **배열 처리 (`[]`):** 배열의 모든 요소를 개별적으로 출력하거나, `.[0]`과 같이 인덱스로 접근합니다.
- **파이프라인 (`|`):** 앞선 필터의 출력 결과를 다음 필터의 입력으로 전달합니다. 이는 유닉스 쉘의 파이프와 유사한 동작 방식입니다.
### 주요 연산자 및 필터 요약
| 연산자/함수 | 설명 | 예시 | 결과 |
| :--- | :--- | :--- | :--- |
| `.` | 루트 객체 전체 출력 | `jq '.'` | 전체 JSON 출력 |
| `.key` | 특정 키의 값 추출 | `jq '.name'` | `"Alice"` |
| `.[]` | 배열의 모든 요소 전개 | `jq '.items[]'` | 배열 내 각 객체 출력 |
| `.[index]` | 배열의 특정 인덱스 접근 | `jq '.items[0]'` | 첫 번째 요소 출력 |
| `|` | 필터 체이닝 (결과 전달) | `jq '.items[] | .name'` | 모든 아이템의 이름만 추출 |
| `slice` | 배열의 일부 구간 추출 | `jq '.items[0:2]'` | 0번부터 1번 인덱스까지 추출 |
## 고급 기능 및 함수
### 제어문 및 내장 함수
단순 추출을 넘어 데이터를 가공하기 위해 다음과 같은 고급 기능을 제공합니다.
- **`select(condition)`**: 조건에 맞는 요소만 필터링합니다.
- 예: `jq '.[] | select(.age > 20)'` (나이가 20 초과인 요소만 추출)
- **`map(filter)`**: 배열의 모든 요소에 특정 필터를 적용하여 새로운 배열을 생성합니다.
- 예: `jq 'map(.name)'` (객체 배열에서 이름만 추출하여 새로운 배열 생성)
- **`keys`**: 객체의 모든 키를 배열 형태로 반환합니다.
- **`length`**: 배열의 길이, 문자열의 길이, 또는 객체의 키 개수를 반환합니다.
- **`if-then-else`**: 조건부 로직을 구현합니다.
- **문자열 보간법 (`\(expression)`)**: 문자열 내에 `\( )`를 사용하여 변수나 필터의 결과값을 삽입할 수 있습니다. (예: `"Hello, \(.name)!"`)
### 실전 복잡 쿼리 예제
다음과 같은 JSON 데이터(`users.json`)가 있다고 가정합니다.
```json
[
{"id": 1, "name": "Kim", "role": "admin", "tags": ["dev", "ops"]},
{"id": 2, "name": "Lee", "role": "user", "tags": ["design"]},
{"id": 3, "name": "Park", "role": "admin", "tags": ["dev", "security"]}
]
```
**요구사항: 역할이 'admin'인 사용자들의 이름만 추출하여 새로운 배열로 만들기**
```bash
jq '[ .[] | select(.role == "admin") | .name ]' users.json
# 결과: ["Kim", "Park"]
```
## 실무 활용 사례
### API 응답 값 파싱
`curl` 명령어로 받은 JSON 응답에서 특정 값만 추출하여 쉘 변수에 할당하는 방식이 가장 흔하게 사용됩니다. 이때 `-r` (raw-output) 옵션을 사용하지 않으면 결과값에 쌍따옴표(`"`)가 포함되어 쉘 변수 활용 시 오류가 발생할 수 있으므로 주의해야 합니다.
```bash
# GitHub API를 통해 특정 저장소의 Star 개수 추출 (-r 옵션으로 따옴표 제거)
STAR_COUNT=$(curl -s https://api.github.com/repos/jqlang/jq | jq -r '.stargazers_count')
echo "This repo has $STAR_COUNT stars."
```
### 로그 파일 분석 및 변형
JSON 형식의 로그 파일에서 에러 레벨이 "ERROR"인 로그의 메시지와 타임스탬프만 추출하여 텍스트 파일로 저장하는 사례입니다.
```bash
cat app.log | jq -r '.[] | select(.level == "ERROR") | "\(.timestamp) - \(.message)"' > error_report.txt
```
## JSON 입력 방식별 차이점
`jq`는 다양한 방식으로 데이터를 입력받을 수 있으며, 입력 방식에 따라 처리 흐름이 달라집니다.
| 입력 방식 | 명령어 예시 | 특징 |
| :--- | :--- | :--- |
| **파일 입력** | `jq '.' file.json` | 파일 시스템에서 직접 읽어 처리하며 대용량 파일에 적합함 |
| **표준 입력 (stdin)** | `cat file.json | jq '.'` | 다른 명령어의 출력을 파이프로 받아 처리하는 전형적인 유닉스 방식 |
| **문자열 입력** | `echo '{"a":1}' | jq '.'` | 짧은 JSON 문자열을 즉석에서 테스트할 때 유용함 |
| **여러 파일 입력** | `jq '.' a.json b.json` | 여러 파일을 순차적으로 읽어 각각 필터를 적용함 |
## 성능 최적화 및 팁
### 자주 쓰이는 옵션 요약
| 옵션 | 긴 이름 | 설명 |
| :--- | :--- | :--- |
| `-r` | `--raw-output` | 출력값의 따옴표를 제거하고 원시 문자열(raw string)로 출력. 쉘 스크립트 연동 시 필수적임 |
| `-c` | `--compact-output` | 줄바꿈 없이 한 줄로 압축하여 출력 (로그 저장 시 유리) |
| `-S` | `--sort-keys` | 객체의 키를 알파벳 순으로 정렬하여 출력 |
| `-s` | `--slurp` | 입력된 여러 JSON 객체를 하나의 큰 배열로 묶어서 처리 |
### 대용량 파일 처리 주의점
`jq`는 기본적으로 입력 데이터를 메모리에 로드하여 처리합니다. 수 GB 단위의 매우 큰 JSON 파일을 처리할 때 메모리 부족 현상이 발생할 수 있습니다. 이 경우 다음과 같은 전략을 권장합니다.
1. **`--stream` 옵션**: 데이터를 스트리밍 방식으로 처리하여 메모리 사용량을 최소화합니다. 다만, 일반 필터와 문법이 완전히 다르며 매우 복잡하므로, 사용 전 [공식 문서의 Streaming 섹션](https://stedolan.github.io/jq/manual/#streaming)을 반드시 참조하십시오.
- 예시: `jq --stream 'select(.[0][0] == "key")' large.json`
2. **`split` 활용**: 파일을 적절한 크기로 나누어 처리합니다.
## 참고 문헌 및 링크
- [jq 공식 매뉴얼 (Manual)](https://stedolan.github.io/jq/manual/)
- [jq 공식 GitHub 저장소](https://github.com/jqlang/jq)
- [jq PlayGround (온라인 테스트 도구)](https://jqplay.org/)