Skip to content
블로그로 돌아가기
튜토리얼

jq 치트시트: 실무에서 쓰는 30가지 JSON 커맨드 라인 패턴 온라인 가이드

필터링, 변환, 추출까지 실전에서 검증된 30가지 jq 패턴을 kubectl, AWS, 로그 파일 예제로 정리한 온라인 가이드입니다.

12분 소요

jq 치트시트: 실무에서 쓰는 30가지 JSON 커맨드 라인 패턴

kubectl get pods -o json의 출력을 less로 파이프 처리하면 터미널이 2메가바이트짜리 JSON 벽 앞에서 멈춥니다. 원하는 건 Running 단계에 있는 파드 이름뿐인데 말입니다. jq는 그 작업을 세 글자 필터로 해냅니다. 어휘만 알고 있다면.

문법 레퍼런스가 아니라 실제로 입력하게 될 30가지 패턴을 작업별로 묶었습니다. 접근, 필터, 변환, 집계, 포매팅, 그리고 kubectl, aws, docker와 연결하는 방법까지 다룹니다.

jq, 브라우저 포매터, 코드 중 언제 무엇을 써야 할까요

jq가 항상 정답은 아닙니다. 선택지는 셋입니다.

상황최적의 도구이유
API 응답 하나, 구문 강조와 에러 줄 번호가 필요할 때브라우저 JSON 포맷터시각적 비교, 설정 불필요, 브라우저 내에서 비공개 처리
셸 파이프라인, 로그 처리, CI 스크립트, 원격 서버jq조합 가능, 스크립팅 가능, GUI 의존성 없음
비즈니스 로직, 유닛 테스트, 복잡한 분기언어 코드(JS / 파이썬)진짜 디버거, 타입, 라이브러리

작업이 셸 파이프라인 안에서 이루어진다면 jq를 고르세요. 그 외에는 다른 쪽이 대개 더 편합니다.

설치와 첫 번째 파이프라인

jq는 모든 주요 플랫폼에서 단일 바이너리로 제공됩니다.

# macOS
brew install jq

# Debian / Ubuntu
sudo apt install jq

# Windows (winget)
winget install jqlang.jq

아이덴티티 필터를 사용한 첫 번째 파이프라인입니다.

curl -s https://api.github.com/users/octocat | jq .

. 필터는 입력을 그대로 받아 예쁘게 출력합니다. 그것만으로도 “이 JSON을 에디터에서 열어보자” 순간의 대부분을 대체합니다.

실제 사용의 90%를 커버하는 다섯 가지 플래그입니다.

플래그용도
-rRaw 출력 — 문자열 결과에서 감싸는 따옴표를 제거
-cCompact — 한 줄에 JSON 값 하나(NDJSON)
-sSlurp — 모든 입력을 단일 배열로 읽기
-RRaw 입력 — JSON 대신 각 줄을 문자열로 읽기
-nNull 입력 — stdin을 읽지 않고 null을 입력으로 사용

핵심 멘탈 모델: 필터와 파이프

필터(filter)는 JSON 값 하나를 입력으로 받아 0개 이상의 JSON 값을 출력합니다. 필터는 파이프 |로 조합되며, 왼쪽 필터의 각 출력이 오른쪽 필터의 입력으로 전달됩니다. 셸 파이프와 같은 멘탈 모델이며, 바이트 대신 JSON 값이 흐른다는 차이만 있습니다.

# . — 아이덴티티
echo '{"name":"Alice"}' | jq '.'

# .key — 필드 접근
echo '{"name":"Alice"}' | jq '.name'

# .key.sub — 깊은 경로
echo '{"user":{"email":"a@x.com"}}' | jq '.user.email'

# .[] — 배열 원소 순회(여러 출력 생성)
echo '[{"id":1},{"id":2}]' | jq '.[] | .id'

# 파이프 조합: .items[]의 각 출력이 .name으로 전달됨
echo '{"items":[{"name":"a"},{"name":"b"}]}' | jq '.items[] | .name'

이게 문법의 전부입니다. 아래 30가지 패턴은 이 요소들의 조합입니다.

실제로 쓰게 될 30가지 패턴

각 패턴마다 입력 JSON, 명령, 출력을 보여줍니다. 터미널에 붙여 바로 써보세요.

접근과 추출 (패턴 1–5)

패턴 1 — ?로 안전하게 접근하기

존재하지 않을 수도 있는 필드를 크래시 없이 접근합니다.

echo '{"name":"Alice"}' | jq '.address?.city?'
# Output: null

?는 누락된 키에서 발생하는 에러를 억제합니다. 이게 없으면 .address가 없을 때 .address.city는 타입 에러를 던집니다.

패턴 2 — 깊은 경로 접근

echo '{"user":{"profile":{"email":"a@x.com"}}}' | jq '.user.profile.email'
# Output: "a@x.com"

패턴 3 — 배열 슬라이싱

echo '[10,20,30,40,50]' | jq '.[1:3]'
# Output: [20, 30]

echo '[10,20,30,40,50]' | jq '.[-1]'
# Output: 50

음수 인덱스는 끝에서부터 셉니다. 슬라이스는 파이썬과 같은 반열린 구간을 사용합니다.

패턴 4 — 재귀 하강으로 모든 일치 키 찾기

echo '{"a":{"name":"x"},"b":[{"name":"y"},{"id":1}]}' | jq '.. | .name? | select(. != null)'
# Output: "x"
#         "y"

..는 트리의 모든 값을 순회합니다. .name?select를 결합하면 깊이와 무관하게 모든 name 필드를 뽑을 수 있습니다. 낯선 스키마 탐색에 유용합니다.

패턴 5 — 객체의 모든 키 나열

echo '{"zebra":1,"apple":2,"mango":3}' | jq 'keys'
# Output: ["apple", "mango", "zebra"]

echo '{"zebra":1,"apple":2,"mango":3}' | jq 'keys_unsorted'
# Output: ["zebra", "apple", "mango"]

keys는 알파벳 순으로 정렬하고, keys_unsorted는 삽입 순서를 유지합니다.

필터 (패턴 6–10)

패턴 6 — 조건으로 배열 필터링

echo '[{"age":20},{"age":30},{"age":40}]' | jq 'map(select(.age > 25))'
# Output: [{"age":30},{"age":40}]

map(f)는 각 원소에 f를 적용하고, select(cond)는 조건이 참인 원소만 남깁니다.

패턴 7 — 문자열 접두사 일치

echo '[{"name":"api-gateway"},{"name":"web-ui"},{"name":"api-auth"}]' \
  | jq '.[] | select(.name | startswith("api"))'
# Output: {"name":"api-gateway"}
#         {"name":"api-auth"}

유용한 함수가 더 있습니다. endswith("..."), contains("..."), test("^regex$").

패턴 8 — 조건 결합

echo '[{"type":"A","count":5},{"type":"A","count":15},{"type":"B","count":20}]' \
  | jq '.[] | select(.type == "A" and .count > 10)'
# Output: {"type":"A","count":15}

and, or, not은 예상대로 동작합니다.

패턴 9 — 민감한 필드 삭제

echo '{"user":"alice","password":"s3cret","token":"abc"}' | jq 'del(.password, .token)'
# Output: {"user":"alice"}

del()은 여러 경로를 받으며, 경로 중 일부가 없어도 안전합니다.

패턴 10 — 필드 기준 중복 제거

echo '[{"id":1,"v":"a"},{"id":2,"v":"b"},{"id":1,"v":"a2"}]' | jq 'unique_by(.id)'
# Output: [{"id":1,"v":"a"},{"id":2,"v":"b"}]

unique는 값 전체를 기준으로, unique_by(f)는 필터 결과를 기준으로 중복을 제거합니다.

변환 (패턴 11–15)

패턴 11 — 필드 이름 변경

echo '[{"first_name":"Alice","age":30}]' | jq 'map({name: .first_name, age})'
# Output: [{"name":"Alice","age":30}]

단축 표기 {age}{age: .age}와 동일합니다.

패턴 12 — 문자열 보간으로 계산 필드 추가

echo '[{"first":"Alice","last":"Chen"}]' \
  | jq 'map(. + {fullName: "\(.first) \(.last)"})'
# Output: [{"first":"Alice","last":"Chen","fullName":"Alice Chen"}]

\(expr)expr을 평가해 그 값을 문자열에 보간합니다.

패턴 13 — 중첩 배열 평탄화

echo '[{"tags":["a","b"]},{"tags":["c"]}]' | jq '[.[] | .tags[]]'
# Output: ["a","b","c"]

echo '[[1,2],[3,[4,5]]]' | jq 'flatten'
# Output: [1,2,3,4,5]

flatten은 선택적 깊이 인수를 받습니다. flatten(1)은 한 단계만 벗겨냅니다.

패턴 14 — 객체와 배열 간 변환

echo '{"a":1,"b":2}' | jq 'to_entries'
# Output: [{"key":"a","value":1},{"key":"b","value":2}]

echo '[{"key":"a","value":1},{"key":"b","value":2}]' | jq 'from_entries'
# Output: {"a":1,"b":2}

이 쌍은 객체 키를 순회하는 변환을 가능하게 합니다. 점 경로 문법만으로는 직접 할 수 없습니다.

패턴 15 — 두 객체의 깊은 병합

echo '{"a":{"x":1},"b":2}' | jq '. * {a:{y:9}, c:3}'
# Output: {"a":{"x":1,"y":9},"b":2,"c":3}

* 연산자는 깊은 병합을 수행합니다. 얕은 병합에는 +를 사용합니다(오른쪽 값이 우선합니다).

집계 (패턴 16–20)

패턴 16 — 배열, 객체, 문자열의 길이

echo '[1,2,3,4]' | jq 'length'      # 4
echo '{"a":1,"b":2}' | jq 'length'  # 2
echo '"hello"' | jq 'length'        # 5

패턴 17 — 필드 합계

echo '[{"price":10},{"price":25},{"price":5}]' | jq '[.[].price] | add'
# Output: 40

add는 입력 타입에 따라 숫자를 더하거나, 문자열을 연결하거나, 배열을 병합합니다.

패턴 18 — 필드 기준 그룹화

echo '[{"cat":"A","n":1},{"cat":"B","n":2},{"cat":"A","n":3}]' | jq 'group_by(.cat)'
# Output: [[{"cat":"A","n":1},{"cat":"A","n":3}],[{"cat":"B","n":2}]]

각 그룹이 내부 배열이 됩니다. map과 결합해 그룹별로 집계하세요.

패턴 19 — 내림차순 정렬

echo '[{"date":"2026-01-03"},{"date":"2026-01-01"},{"date":"2026-01-02"}]' \
  | jq 'sort_by(.date) | reverse'
# Output: [{"date":"2026-01-03"},{"date":"2026-01-02"},{"date":"2026-01-01"}]

ISO 8601 날짜 문자열은 문자열로도 올바르게 정렬됩니다. 다른 형식이면 먼저 파싱하세요. Unix 타임스탬프 가이드에서 에포크 초, 밀리초, 시간대 변환을 다룹니다.

패턴 20 — 필드 기준 최댓값 또는 최솟값

echo '[{"name":"a","rating":4.1},{"name":"b","rating":4.8},{"name":"c","rating":3.9}]' \
  | jq 'max_by(.rating)'
# Output: {"name":"b","rating":4.8}

min_by, max_by는 단일 원소를 반환합니다. 상위 N개가 필요하면 sort_by(.rating) | reverse | .[:N]을 쓰세요.

출력 포매팅 (패턴 21–25)

패턴 21 — CSV 출력

echo '[{"name":"Alice","age":30},{"name":"Bob","age":25}]' \
  | jq -r '.[] | [.name, .age] | @csv'
# Output: "Alice",30
#         "Bob",25

@csv는 문자열에 따옴표를 두르고 내부 따옴표를 이스케이프합니다. -r는 바깥 JSON 문자열 따옴표를 제거해 CSV를 그대로 파이프할 수 있게 합니다. CSV와 JSON의 완전한 왕복 변환은 CSV·JSON 변환 가이드에서 다룹니다.

패턴 22 — TSV 출력

echo '[{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]' \
  | jq -r '.[] | [.id, .name] | @tsv'
# Output: 1	Alice
#         2	Bob

탭으로 구분된 출력은 cut, awk, column -t와 잘 어울립니다.

패턴 23 — Raw 문자열 출력

echo '["alpha","beta"]' | jq -r '.[]'
# Output: alpha
#         beta

-r 없이는 각 줄이 따옴표로 감싸져 나옵니다. Raw 출력은 xargs, while read, 다른 셸 명령에 전달할 때 쓰는 형식입니다.

패턴 24 — NDJSON / JSON Lines

echo '[{"a":1},{"a":2}]' | jq -c '.[]'
# Output: {"a":1}
#         {"a":2}

각 줄이 독립적인 JSON 값입니다. Kafka, Elasticsearch, 대부분의 구조화 로거가 사용하는 형식이죠. -c는 내부 공백도 모두 제거합니다.

패턴 25 — 문자열 보간으로 형식화된 출력

echo '[{"name":"server-1","cpu":0.73},{"name":"server-2","cpu":0.21}]' \
  | jq -r '.[] | "\(.name): \(.cpu * 100)% CPU"'
# Output: server-1: 73% CPU
#         server-2: 21% CPU

원시 JSON이 거슬리는 요약이나 로그 줄에 잘 맞습니다.

실전 DevOps (패턴 26–30)

패턴 26 — kubectl: 실행 중인 모든 파드의 이름

kubectl get pods -o json \
  | jq -r '.items[] | select(.status.phase=="Running") | .metadata.name'

파이프라인: 파드를 순회하고, Running만 남기고, 이름을 raw 문자열로 출력합니다.

패턴 27 — AWS EC2: 공인 IP를 가진 인스턴스 ID

aws ec2 describe-instances \
  | jq -r '.Reservations[].Instances[] | [.InstanceId, .PublicIpAddress // "none"] | @tsv'

// 대안 연산자는 필드가 null일 때 폴백을 제공하므로, 출력 열에 문자 그대로의 null이 들어가지 않습니다.

패턴 28 — GitHub API: 페이지네이션 결과 병합

for p in 1 2 3; do
  curl -s "https://api.github.com/orgs/myorg/repos?per_page=100&page=$p"
done | jq -s 'add | map(.name)'

-s는 모든 응답을 하나의 배열의 배열로 slurp하고, add가 이를 이어 붙이고, map(.name)이 이름을 추출합니다. 페이지네이션 API에 공통된 패턴입니다.

패턴 29 — 구조화된 로그 파일 필터링

cat app.log | jq -c 'select(.level=="error")'

로그 파일이 NDJSON(한 줄에 JSON 객체 하나)이라고 가정합니다. 실시간 모니터링을 위해 tail -f와 함께 쓰세요.

tail -f app.log | jq -c 'select(.level=="error") | {ts: .timestamp, msg: .message}'

패턴 30 — Docker: 사용 중인 모든 이미지 이름

docker inspect $(docker ps -q) | jq -r '.[].Config.Image' | sort -u

호스트 전반에서 어떤 이미지 버전이 실행 중인지 빠르게 확인할 때 좋습니다.

자주 발생하는 에러와 해결법

jq 사용자가 다 한 번씩 마주치는 문제들입니다. 해결법을 미리 알면 시간을 많이 아낍니다.

Cannot iterate over null (null)

순회하려던 입력 필드가 null이거나 누락된 경우입니다. 해결법은 두 가지입니다.

# 옵션 A: 옵셔널 연산자
echo '{}' | jq '.items[]?'
# Output: (아무것도 없음, 에러 없음)

# 옵션 B: 기본값을 주는 대안 연산자
echo '{}' | jq '(.items // [])[]'
# Output: (아무것도 없음, 에러 없음)

조용히 건너뛸 때는 ?, 빈 배열을 강제해 이후 필터가 돌게 하려면 // []를 씁니다.

Cannot index array with "key"

현재 값이 배열인데 .foo라고 쓴 경우입니다. 순회하려면 []를 추가하세요.

# 잘못된 예
echo '{"users":[{"name":"Alice"}]}' | jq '.users.name'
# Error: Cannot index array with "name"

# 올바른 예
echo '{"users":[{"name":"Alice"}]}' | jq '.users[].name'
# Output: "Alice"

셸 따옴표 문제

jq 프로그램 전체는 작은따옴표로 감싸고, 문자열 리터럴은 그 안에서 큰따옴표로 쓰세요.

# 어디서나 동작
jq '.users[] | select(.role == "admin")'

# 깨짐 — 큰따옴표가 먼저 셸에 의해 해석됨
jq ".users[] | select(.role == \"admin\")"

Windows PowerShell 특수 사례

PowerShell은 작은따옴표를 같은 방식으로 다루지 않습니다. 프로그램 전체를 큰따옴표로 감싸고 내부 따옴표를 이스케이프하거나, here-string을 사용하세요.

jq "@'
.users[] | select(.role == \"admin\")
'@"

조금이라도 복잡한 작업이라면 필터를 .jq 파일에 저장하고 jq -f filter.jq로 실행하세요.

Raw 출력 오용

-r는 문자열 결과에만 영향을 줍니다. 객체에 적용해도 평범한 JSON 객체가 나옵니다.

echo '{"a":1}' | jq -r '.'
# Output: {"a":1}     ← 그대로; -r가 벗겨낼 것이 없었음

특정 필드만 따옴표 없이 받고 싶다면 먼저 선택하세요. jq -r '.a'.

jq는 주석이나 후행 쉼표가 있는 JSON을 거부합니다

echo '{"a": 1, /* note */ "b": 2,}' | jq .
# parse error: Invalid numeric literal

jq는 엄격한 RFC 8259 JSON을 따릅니다. 주석, 후행 쉼표, 따옴표 없는 키는 안 됩니다. 파일이 JSON5나 JSONC(설정 파일에서 흔함)이면 확장을 먼저 제거하세요. JSON5·JSONC 포매팅 가이드에서 어떤 파서가 이를 처리하는지, jq로 파이프하기 전에 엄격한 JSON으로 변환하는 방법을 다룹니다.

jq vs 대안: gron, fx, jj, yq

jq가 유일한 선택지는 아니며, 때로는 다른 도구가 더 빠릅니다.

도구강점언제 쓰나
gronJSON을 grep 가능한 경로로 평탄화낯선 스키마 탐색 — 키가 어디 있는지 모를 때
fx구문 강조가 있는 대화형 TUI 탐색기큰 JSON을 손으로 탐색할 때
jjjq보다 훨씬 빠르지만 문법 제한적수백만 레코드를 처리하는 핫 루프
yq같은 필터 언어를 YAML에 적용Kubernetes 매니페스트와 CI 설정
브라우저 JSON 포맷터구문 강조, 정확한 에러 메시지, 설치 불필요개발 중 단일 응답 디버깅

일상적인 셸 작업에는 조합성 면에서 jq가 유리합니다. 일회성 탐색에는 gron이 종종 더 빠릅니다. YAML에는 yq를 쓰고, yq로 뽑은 값을 다시 jq로 파이프하려 하지 마세요.

일상 사용을 위한 팁

jq를 몸에 익히는 데 도움이 되는 습관입니다.

  1. $HOME.jqrc를 두세요. 헬퍼 함수를 여기에 넣으면 모든 jq 실행에서 쓸 수 있습니다.

    def running: select(.status.phase == "Running");
    def table(f): [f] | @tsv;
  2. 복잡한 필터에는 jqplay.org를 쓰세요. 왼쪽에 JSON을, 오른쪽에 필터를 두고 다듬은 뒤 스크립트에 반영하세요.

  3. history로 자신만의 치트시트를 만드세요. history | grep 'jq ' | sort -u > ~/jq-patterns.txt로 실제 쓴 패턴을 모을 수 있습니다.

  4. 낯선 스키마에는 브라우저 JSON 포맷터와 함께 쓰세요. 먼저 구조를 눈으로 훑어 경로를 찾고 jq 명령을 작성합니다.

  5. 실시간 값 모니터링: watch -n 5 "curl -s api.example.com/health | jq '.uptime'". 5초마다 새로고침하는 가벼운 운영 대시보드입니다.

FAQ

jq가 무엇이며 개발자들이 왜 사용하나요?

jq는 커맨드 라인 JSON 프로세서입니다. 셸 파이프라인 안에서 JSON을 추출·필터링·변환하며 파이썬이나 Node 스크립트가 필요 없습니다. API 응답, 로그 파일, kubectl 출력에서 원하는 필드까지 가는 가장 짧은 경로입니다.

jq를 Windows에서도 사용할 수 있나요?

네. winget install jqlang.jq, Chocolatey의 choco install jq, 또는 jqlang.org의 바이너리로 설치할 수 있습니다. PowerShell 따옴표 규칙은 bash와 다르므로, 헷갈릴 때는 필터를 .jq 파일에 저장하고 jq -f filter.jq로 실행하세요.

jq는 브라우저 JSON 포맷터와 어떻게 다른가요?

브라우저 JSON 포맷터는 대화형입니다. JSON을 붙여넣고 구문 강조·에러를 본 뒤 결과를 복사합니다. jq는 비대화형으로, 변환을 한 번 써두고 셸 파이프라인에서 실행합니다. 응답 하나를 디버깅할 때는 브라우저를, 같은 작업을 수백 건에 자동화할 때는 jq를 쓰세요.

jq는 왜 “Cannot iterate over null”이라고 말하나요?

null인 값(보통 입력에서 필드가 누락됨)을 .[]로 순회하려 했기 때문입니다. 옵셔널 연산자 .items[]?로 해결하거나, .items // [] | .[]로 기본값을 제공하세요.

jq로 파일을 그 자리에서 수정할 수 있나요?

아닙니다. jq는 stdout에 씁니다. 임시 파일을 쓰거나 moreutils의 sponge를 쓰세요. 예: jq '.version = "2.0"' config.json | sponge config.json. 원본은 항상 먼저 백업하세요. 오타 난 필터 하나로 파일이 덮어써집니다.

curl 응답에 jq를 어떻게 사용하나요?

curl -s의 출력을 jq로 파이프하세요. -s 플래그는 curl의 진행 표시기를 숨겨 JSON 본문만 jq에 도달하게 합니다.

curl -s https://api.github.com/users/octocat | jq '.name, .blog'

jq의 |와 셸의 |는 어떻게 다른가요?

셸 파이프는 프로세스 사이에서 바이트를 보냅니다. jq의 파이프는 하나의 jq 실행 안에서 필터 사이로 JSON 값을 보냅니다. 내부 파이프가 많은 단일 jq 명령은 하나의 프로세스로 실행되므로 jq | jq | jq로 이어붙이는 것보다 비용이 적습니다.

jq는 JSON Lines(NDJSON)를 처리할 수 있나요?

네, 기본 지원입니다. jq는 공백으로 구분된 각 줄을 독립 JSON 값으로 읽습니다. NDJSON 출력은 -c, NDJSON을 단일 배열로 모으려면 -s를 쓰세요.

필터링 없이 JSON을 예쁘게 출력하려면 어떻게 하나요?

아이덴티티 필터를 쓰세요. cat data.json | jq . 또는 jq . < data.json. 필터 없이도 파싱·검증·2칸 들여쓰기 출력을 해 줍니다.

GUI가 있는 jq 대안이 있나요?

네. fx는 대화형 TUI를 지원합니다. 설치가 필요 없는 GUI가 필요하면 브라우저 기반 JSON 포맷터가 탐색·검증의 대부분을 커버합니다. jqplay.org 같은 웹 도구에서는 라이브 미리보기와 함께 jq 자체를 쓸 수 있습니다.

파이썬 스크립트 대신 jq를 언제 써야 하나요?

작업이 일회성이고 셸 파이프라인에 맞으며 필터·변환·추출 범위 안에 머무르면 jq를 쓰세요. 유닛 테스트, 복잡한 상태, 서드파티 라이브러리, .jq 파일로 읽기 어려워지는 분기 로직이 필요하면 파이썬으로 넘어가세요.

jq에서 정규식을 어떻게 사용하나요?

jqtest("pattern"), match("pattern"), capture("pattern"), scan("pattern")으로 정규식을 지원하며 모두 PCRE 문법을 씁니다. 플래그는 두 번째 인수로 넘깁니다. 예: 대소문자 무시 test("abc"; "i"). match는 오프셋과 캡처를, scan은 겹치지 않는 모든 일치를 방출합니다.

핵심 요약

  1. 멘탈 모델이 먼저. 필터가 들어오면 0개 이상의 JSON 값이 나오고, |로 조합합니다. 나머지는 문법 세부사항입니다.
  2. 연산자가 아니라 작업 단위로. 위의 30가지가 일상적인 jq 사용의 95%를 덮습니다.
  3. null은 명시적으로. 조용히 건너뛸 때는 ?, 구체적인 폴백이 필요할 때는 // default. Cannot iterate over null의 대부분은 이 둘로 해결됩니다.
  4. jq가 답이 아닐 때를 알기. 단일 응답은 브라우저 JSON 포맷터, YAML은 yq, 복잡한 로직은 코드입니다.
  5. 기존 스택과 결합. jqcurl, kubectl, aws, docker, 로그 파이프라인에서 접착제 역할을 합니다. 로직 계층으로 쓰지는 마세요.

관련 자료: 설정 파일 문법 확장은 JSON5·JSONC 포매팅 가이드, 포맷 변환은 CSV·JSON 변환 가이드, 날짜 필드는 Unix 타임스탬프 가이드를 참고하세요.