리눅스 - jq

코린이·2024년 12월 1일

Linux

목록 보기
25/27

📌 jq

jq 명령어는 리눅스 및 유닉스 계열에서 JSON 데이터를 핸들링할 때 사용되는 명령어다.

jq 명령어를 사용하면 JSON 데이터를 분석, 탐색, 추출할 수 있다. 또한, 데이터 필터링, 출력 서식 지정, 데이터 변환 등의 작업도 가능하다.

명령어 기본 문법

jp <option> <filter> <json file>

옵션 리스트

-r : json 데이터를 로우 데이터(raw data)로 변환
-s : 여러 json 데이터 파일을 하나의 배열로 결합
-c : json 데이터를 압축하여 한 줄로 출력 (가독성 감소)
-M : 색상화 출력 비활성화

필터 리스트

.        : json 데이터 전체 표시 (json 형태로 표시)
'.<key>' : json 데이터 객체 중 특정 키값에 대응하는 값 표시
'.[]'    : 배열에서 항목 접근
|        : 파이프 연산자로 결과를 이어서 처리
select   : 조건에 맞는 항목 필터링
map      : 배열의 각 요소에 대한 필터 적용

✅ JSON 데이터 핸들링

모든 json 데이터 확인

jq . data.json
{
  "name": "홍길동",
  "age": 25,
  "email": "honggildong@example.com",
  "isStudent": true,
  "courses": [
    {
      "courseName": "수학",
      "courseCode": "MATH101",
      "grade": "A"
    },
    {
      "courseName": "영어",
      "courseCode": "ENG202",
      "grade": "B"
    }
  ],
  "address": {
    "street": "서울시 강남구",
    "city": "서울",
    "postalCode": "06234"
  }
}

json 데이터 필터링 (키 참조값 확인)

jq '.name' data.json
"홍길동"

json 데이터 필터링 (특정 배열 접근)

jq '.courses[]' data.json
{
  "courseName": "수학",
  "courseCode": "MATH101",
  "grade": "A"
}
{
  "courseName": "영어",
  "courseCode": "ENG202",
  "grade": "B"
}

json 데이터 필터링 (특정 배열 접근 후 키 참조값 확인)

jq '.courses[].courseName' data.json
"수학"
"영어"

json 데이터 수정

jq '.address.street = "서울시 송파구"' data.json
{
  "name": "홍길동",
  "age": 25,
  "email": "honggildong@example.com",
  "isStudent": true,
  "courses": [
    {
      "courseName": "수학",
      "courseCode": "MATH101",
      "grade": "A"
    },
    {
      "courseName": "영어",
      "courseCode": "ENG202",
      "grade": "B"
    }
  ],
  "address": {
    "street": "서울시 송파구",
    "city": "서울",
    "postalCode": "06234"
  }
}

json 데이터 재구조화

jq '.courses[] | {name: .courseName, code: .courseCode}' data.json
{
  "name": "수학",
  "code": "MATH101"
}
{
  "name": "영어",
  "code": "ENG202"
}

로우 데이터(raw data) 변환

# -r 옵션을 사용하여 "" 제거 (로우 데이터로 변환)
jq -r .name data.json
홍길동

jq .name data.json (기본 json 데이터)
"홍길동"

json 데이터 합치기

# data1.json
{
  "name": "홍길동",
  "age": 20
}

# data2.json
{
  "name": "신짱구",
  "age": 25
}

------------------------------------------
# data1.json, data2.json 합치기
jq -s . data1.json data2.json
[
  {
    "name": "홍길동",
    "age": 20
  },
  {
    "name": "신짱구",
    "age": 25
  }
]

json 데이터 압축

jq -c . data.json
{"name":"홍길동","age":25,"email":"honggildong@example.com","isStudent":true,"courses":[{"courseName":"수학","courseCode":"MATH101","grade":"A"},{"courseName":"영어","courseCode":"ENG202","grade":"B"}],"address":{"street":"서울시 강남구","city":"서울","postalCode":"06234"}}

json 데이터 컬러 비활성화

jq -M . data.json

json 데이터 조건 필터링

select 내부에 조건식을 작성하여 데이터 필터링
(등급이 "B"인 데이터만 필터링)

jq '.courses[] | select(.grade == "B")'  data.json
{
  "courseName": "영어",
  "courseCode": "ENG202",
  "grade": "B"
}

json 데이터 항목 필터링

map 내부에 원하는 항목을 기입하여 필터링
(courseName, grade만 필터링)

jq '.courses | map({courseName, grade})' data.json
[
  {
    "courseName": "수학",
    "grade": "A"
  },
  {
    "courseName": "영어",
    "grade": "B"
  }
]

0개의 댓글