본문 바로가기
C.W.K.
Stream
Lesson 02 of 08 · published

변환 도구 — yq, jq, dasel, gron

~12 min · interop, yq, jq, tools

Level 0평문
0 XP0/64 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

네 포맷 잇는 CLI toolchain

jq — JSON 전용 쿼리 언어

이 바닥을 연 도구야. jq 는 JSON 을 파싱하고, 쿼리를 걸고, 다시 JSON 으로 내보내. 그 필터 문법 (.foo[], map, select) 이 사실상 나머지 도구들의 공용어가 됐어.

yq — 같은 문법, 네 포맷 다

Mike Farah 의 yq 는 jq 의 필터 언어를 YAML, JSON, TOML, XML, CSV 에 그대로 얹었어. yq -p toml -o yaml file.toml 이라고 하면 TOML 을 읽어서 YAML 로 뱉어. 범용 변환 도구로는 이만한 게 없어.

dasel — 여러 포맷 가로지르는 selector

dasel.config.server.port 같은 통일된 selector 문법 하나로 JSON, YAML, TOML, XML, CSV 를 다 다뤄. 단순히 값 하나 꺼내는 데는 yq 보다 가볍고, 변환 쪽 능력은 비슷해.

gron — grep 위해 JSON 평탄화

gron 은 중첩된 JSON 을 줄마다 대입문 하나씩으로 펴줘. json.users[0].name = "Pippa"; 이런 식으로. 그러면 grep 이 JSON 에도 우리가 기대하는 대로 먹혀. gron --ungron 으로 원래 모양을 되돌릴 수도 있고. 깊이 파묻힌 API 응답에서 필드를 찾아내 뽑을 때 정확히 그 자리만 짚어줘.

원칙: jq 의 필터 언어를 한 번만 제대로 배워둬. yq 를 통해 YAML 과 TOML 에서도 그대로 써먹게 되니까. config 감사, 로그 뒤지기, CI 파이프라인 이어붙이기까지 두루 값을 해. YAML 파일 좀 주무르겠다고 Python 을 켜는 순간이 오면, yq 가 있다는 걸 잊은 거야.

Code

yq — 필요한 모든 변환·bash
# YAML → JSON
yq -o json file.yaml

# JSON → YAML
yq -p json -o yaml file.json

# TOML → YAML
yq -p toml -o yaml pyproject.toml

# YAML → TOML
yq -p yaml -o toml file.yaml

# JSON → TOML
yq -p json -o toml file.json

# 라운드트립 — 제자리 pretty-print
yq -i . config.yaml
jq + yq 조합·bash
# multi-document YAML 가로질러 모든 replicas 찾기
yq '.. | select(has("replicas")) | .replicas' deploy/*.yaml

# label 가진 open PR 만 PR JSON 필터
gh pr list --json number,title,labels | \
  jq '[.[] | select(.labels[]?.name == "ready-for-review")]'

# pyproject.toml [project] block 을 JSON 으로 변환
yq -p toml -o json '.project' pyproject.toml
dasel — 빠른 lookup·bash
# 값 가져오기
dasel -f config.yaml '.server.port'

# 값 설정 (제자리)
dasel put -f config.yaml -v 9000 '.server.port'

# -r/-w 플래그로 변환
dasel -r yaml -w json < config.yaml > config.json
gron — 깊이 중첩 JSON grep·bash
# 평탄화
gh api repos/cwk/foo | gron | head
# json.full_name = "cwk/foo";
# json.private = false;
# json.owner.login = "cwk";

# 응답의 모든 URL 필드 찾기:
gh api repos/cwk/foo | gron | grep '_url'

# gron 출력 편집 후 ungron 으로 JSON 복원
gh api repos/cwk/foo | gron > flat.txt
# (flat.txt 편집)
gron --ungron < flat.txt > modified.json

External links

Exercise

실제로 쓰는 config 를 하나 골라. pyproject.toml 이든 Ansible inventory 든 Kubernetes manifest 든. yq 로 나머지 세 포맷으로 각각 바꿔보고 결과를 diff 해. 뭐가 사라지는지 눈으로 확인해 (주석, 그리고 왕복하면 키 순서까지). 마지막으로 제일 자주 쓴 변환 명령을 dotfiles 에 shell 함수로 저장해둬.

Progress

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

댓글 0

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

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