우분투 실전 명령어 | jq로 JSON 로그 빠르게 필터링하기

서버 로그나 API 응답이 JSON으로 떨어질 때, grep만으로는 필요한 필드를 정확히 뽑기 어렵습니다. 이럴 때 jq를 쓰면 조건 필터, 필드 추출, 집계를 한 번에 처리할 수 있습니다.

언제 쓰는가

  • 애플리케이션 로그가 JSON Lines 형식일 때
  • curl 응답에서 특정 필드만 빠르게 확인해야 할 때
  • 장애 분석 중 에러 레벨 로그만 추려서 볼 때
  • 운영 리포트용으로 상태 코드/유저/시간대별 건수를 셀 때

바로 쓰는 명령어

# jq 설치(우분투)
sudo apt update && sudo apt install -y jq

# JSON 응답 보기 좋게 정렬 출력
curl -s https://api.github.com/repos/torvalds/linux | jq .
# JSON Lines 로그에서 error 레벨만 추출
jq -r 'select(.level=="error") | [.ts, .service, .msg] | @tsv' app.log

# 상태 코드별 개수 집계
jq -r '.status' access.jsonl | sort | uniq -c | sort -nr

핵심 옵션/패턴

  • jq -r: 문자열 따옴표를 제거한 raw 출력으로 파이프 후처리에 유리
  • select(조건): 필요한 레코드만 필터링
  • .field?.subfield?: 키가 없을 수 있는 데이터에서 안전 접근
  • map, group_by, length: 배열 데이터 요약/집계
  • @tsv, @csv: 표 형태로 내보내 엑셀/리포트 연계에 편리

명령 출력 예시

$ jq -r 'select(.level=="error") | [.ts, .service, .msg] | @tsv' app.log
2026-02-18T21:05:11Z	billing	payment timeout
2026-02-18T21:08:44Z	auth	jwt verify failed
$ jq -r '.status' access.jsonl | sort | uniq -c | sort -nr
120 200
 17 500
  9 404

자주 하는 실수

  • jq 없이 grep으로 JSON을 파싱해서 키 순서 변경에 깨지는 경우
  • JSON 배열과 JSON Lines를 같은 입력 형식으로 가정하는 경우
  • 숫자 비교를 문자열 비교로 작성해 필터 결과가 달라지는 경우
  • -r 없이 출력해 따옴표가 포함된 채로 다음 명령에서 실패하는 경우

검증 방법

# 입력 파일이 유효한 JSON인지 먼저 확인
jq . sample.json > /dev/null && echo "valid"

# JSON Lines 파일 각 줄 검증
cat app.log | jq -c . > /dev/null && echo "jsonl valid"
# 필터 결과 건수 확인
jq -c 'select(.level=="error")' app.log | wc -l

# 집계 결과 상위 5개 확인
jq -r '.status' access.jsonl | sort | uniq -c | sort -nr | head -5

운영 팁

  • 운영 서버에는 alias로 jq 기본 포맷을 만들어 두면 반복 작업이 빨라집니다.
  • 샘플 100줄로 먼저 필터를 검증한 뒤 전체 로그에 적용하면 실수 비용이 줄어듭니다.
  • 민감정보가 포함될 수 있으니 추출 전에 토큰, 이메일, 전화번호 마스킹 규칙을 같이 두세요.

출처

  • jq 공식 문서
  • Ubuntu Manpage
  • RFC 8259