본문 바로가기
C.W.K.
Stream
Lesson 07 of 10 · published

jq: JSON 처리

~13 min · jq, json

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

중첩 JSON은 줄만 잘라서는 다룰 수 없어

JSON 객체와 배열은 한 값 안에 다른 값을 중첩해. grep, cut, awk로 따옴표와 쉼표를 세기 시작하면 문자열 안의 특수 문자와 여러 줄 표현 때문에 구조가 깨져. jq는 JSON을 파싱한 뒤 작은 표현식으로 값을 선택하고 변환해 stdout으로 내보내므로, 파이프라인 안에서도 데이터 구조를 보존할 수 있어.

점 하나로 읽고 보기 좋게 출력해

jq '.' data.json의 점은 입력 전체를 그대로 선택하는 항등 필터야. 파싱에 성공하면 들여쓰기와 색이 적용된 출력으로 볼 수 있고, 잘못된 JSON이면 0이 아닌 상태와 오류가 나와. 단순히 보기 좋게 만드는 데 그치지 않고 입력이 실제 JSON으로 해석되는지 확인하는 단계가 되는 거야.

필드와 배열 항목을 선택해

jq '.user.name' data.json
jq '.[0].email' users.json
jq '.[].email' users.json
jq 'length' users.json
jq '[.[].email]' users.json

점은 객체 필드를 따라가고 대괄호는 배열의 위치나 반복을 표현해. 필드가 없을 때 null을 허용할지 오류로 볼지는 작업 계약에 맞춰 명시해야 해.

조건으로 항목을 걸러

jq '.[] | select(.active == true)' users.json
jq '.[] | select(.age > 30) | .name' users.json

select는 조건을 만족하는 값만 다음 단계로 보내. 문자열로 JSON을 검색하는 대신 자료형을 유지한 채 불리언과 숫자를 비교할 수 있어.

출력 모양을 다음 도구에 맞춰

jq '{name: .user.name, id: .user.id}' data.json
jq -r '.[].url' bookmarks.json
jq -c '.[]' events.json
jq -r '.[] | [.name, .count] | @tsv' stats.json

-r은 문자열의 JSON 따옴표를 벗겨 셸 도구로 넘기기 좋고, -c는 각 JSON 값을 한 줄로 압축해. 다음 단계가 JSON을 기대하는지 평문을 기대하는지 먼저 정한 뒤 출력 옵션을 골라.

파이프라인에서도 파싱 실패를 드러내

curl -fsS URL | jq ...처럼 원격 응답을 처리할 때는 HTTP 실패와 JSON 파싱 실패를 모두 확인해야 해. 빈 출력이 정상적인 빈 결과인지 앞 단계의 오류인지 구분하고, 스크립트에서는 파이프라인 각 단계의 상태를 확인하고 임시 파일을 활용해 원본 응답을 보존할 수 있어. 구조화 필터를 쓴다는 사실만으로 입력의 출처와 스키마가 신뢰되는 것은 아니야.

Code

GitHub issue를 깔끔한 표로·bash
curl -s https://api.github.com/repos/cli/cli/issues \
  | jq '.[] | [.number, .title] | @tsv' | head
값 빠르게 추출·bash
echo '{"name":"pippa","version":"1.0"}' | jq -r .name
# 여러 키를 한 번에 출력
echo '{"a":1,"b":2,"c":3}' | jq -r '.a, .c'

External links

Exercise

brew install jq로 설치한 뒤 작은 JSON 배열을 만들어 jq '.', jq -r '.[].u', jq -c '.[]'의 출력을 비교해. 이어서 GitHub API 응답에서 두 필드를 선택하고, HTTP 실패와 JSON 파싱 실패가 각각 어떤 상태로 나타나는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.