중첩 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.jsonselect는 조건을 만족하는 값만 다음 단계로 보내. 문자열로 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 파싱 실패를 모두 확인해야 해. 빈 출력이 정상적인 빈 결과인지 앞 단계의 오류인지 구분하고, 스크립트에서는 파이프라인 각 단계의 상태를 확인하고 임시 파일을 활용해 원본 응답을 보존할 수 있어. 구조화 필터를 쓴다는 사실만으로 입력의 출처와 스키마가 신뢰되는 것은 아니야.