jq 를 이용한 JSON 데이터 처리

LinuxBeginner
지금 연습하기

소개

Linux jq 프로그래밍 랩에 오신 것을 환영합니다! 이 랩에서는 가볍고 다재다능한 명령줄 JSON 프로세서인 jq 사용법을 배우게 됩니다. jqsed와 비슷하지만 JSON 데이터에 특화된 도구라고 생각하시면 됩니다. jq는 구조화된 데이터를 손쉽게 슬라이싱, 필터링, 매핑 및 변환할 수 있도록 해줍니다. 이 랩은 API 또는 구성 파일에서 JSON 데이터를 처리하는 것과 같은 실제 시나리오에 적용할 수 있는 실용적인 예제를 통해 jq의 기본 사용법부터 고급 사용법까지 안내하도록 구성되었습니다.

중국 여행을 계획하고 있고, 위치, 운영 시간, 리뷰 등 다양한 명소에 대한 세부 정보를 제공하는 여행 앱을 사용한다고 상상해 보세요. 앱의 백엔드는 이 데이터를 JSON 형식으로 저장합니다. 여러분의 임무는 여행을 효과적으로 계획하기 위해 특정 정보를 추출하는 것입니다. 이 랩에서는 jq를 사용하여 이 JSON 데이터를 쿼리하고 조작하는 방법을 보여주며, 방문하기에 완벽한 명소를 빠르게 식별할 수 있도록 합니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 94%입니다.학습자들로부터 99%의 긍정적인 리뷰율을 받았습니다.

기본 JSON 쿼리

JSON 객체에서 간단한 데이터를 추출하는 방법을 먼저 배워보겠습니다.

이제 /home/labex/project/ 디렉토리에 data.txt 파일이 있을 것입니다. 이 파일에는 명소 목록을 나타내는 JSON 데이터가 포함되어 있습니다. 파일 내용은 다음과 같습니다.

[
  {
    "name": "The Great Wall of China",
    "location": "Shanxi Province",
    "opening_hours": "24 hours"
  },
  {
    "name": "Terracotta Warriors",
    "location": "XiAn",
    "opening_hours": "9:00 AM -  5:00 PM"
  }
]

여기서 우리의 목표는 이 JSON 데이터에 나열된 모든 명소의 이름을 추출하는 것입니다.

이를 위해 다음 명령을 사용합니다.

cat ~/project/data.txt | jq '.[] | .name'

이 명령은 다음과 같은 출력을 생성합니다.

"The Great Wall of China"
"Terracotta Warriors"

이 명령에서 무슨 일이 일어나는지 자세히 살펴보겠습니다. cat ~/project/data.txt는 단순히 data.txt 파일의 내용을 읽습니다. 파이프라고 하는 | 기호는 cat 명령의 출력을 가져와 jq 명령의 입력으로 제공합니다. 추출 로직의 핵심은 jq '.[] | .name'에 있습니다. jq가 이를 처리하는 방식은 다음과 같습니다.

  • .[]jq에게 JSON 배열의 각 요소 (이 경우 각 명소 객체) 를 반복하도록 지시합니다.
  • |는 다시, 반복의 결과를 다음 작업, 즉 .name으로 파이프합니다.
  • .name은 각 명소 객체에서 "name" 키와 관련된 값을 추출합니다.

본질적으로, 이 명령은 각 명소를 거치면서 이름을 선택하여 표시합니다.

JSON 데이터 필터링

이제 특정 기준에 따라 JSON 데이터를 필터링하는 방법을 살펴보겠습니다.

우리의 목표는 24 시간 운영되는 명소만 찾는 것입니다.

이를 수행하려면 다음 명령을 사용하십시오.

cat ~/project/data.txt | jq '.[] | select(.opening_hours == "24 hours") | .name'

이 명령을 실행하면 다음과 같은 출력이 생성됩니다.

"The Great Wall of China"

필터링이 작동하는 방식은 다음과 같습니다. 이 명령은 cat ~/project/data.txt | jq '.[]'로 시작하며, 이전과 마찬가지로 파일을 읽고 각 명소를 반복합니다. 핵심 부분은 select(.opening_hours == "24 hours")의 추가입니다.

  • select()는 지정한 조건에 따라 JSON 의 요소를 필터링할 수 있는 jq 함수입니다.
  • 조건 .opening_hours == "24 hours"opening_hours 필드의 값이 문자열 "24 hours"와 정확히 같은지 확인합니다. 이 조건을 충족하는 명소만 다음 단계로 전달됩니다.
  • 마지막 부분인 | .name은 필터를 통과한 각 명소의 이름을 추출합니다.

이 경우 "The Great Wall of China"만 조건을 충족하므로 추출되어 표시되는 이름은 하나뿐입니다.

JSON 데이터 변환

이제 JSON 데이터를 다른, 더 유용한 형식으로 변환하는 방법을 살펴보겠습니다.

여기서 우리의 목표는 운영 시간을 더 읽기 쉽게 만드는 것입니다. 특히, 명소가 24 시간 운영되는 경우 "Open 24 hours"를 표시하고, 그렇지 않은 경우 기존 운영 시간 텍스트에 "Open " 접두사를 추가하려고 합니다.

이를 수행하려면 다음 명령을 사용하십시오.

cat ~/project/data.txt | jq '.[] | {name: .name, location: .location, opening_hours: (.opening_hours | if . == "24 hours" then "Open 24 hours" else "Open \(.)" end)}'

이 명령은 다음과 같은 출력을 생성합니다.

{
  "name": "The Great Wall of China",
  "location": "Shanxi Province",
  "opening_hours": "Open 24 hours"
}
{
  "name": "Terracotta Warriors",
  "location": "XiAn",
  "opening_hours": "Open 9:00 AM -  5:00 PM"
}

변환을 이해해 보겠습니다. 이전과 마찬가지로 cat ~/project/data.txt | jq '.[]'는 파일을 읽고 배열의 각 명소를 반복하여 시작합니다. 이 변환의 핵심은 객체 구성과 if-else 문에 있습니다.

  • {name: .name, location: .location, opening_hours: ...}는 원래 객체에서 데이터를 가져와 새 JSON 객체를 생성합니다. 원래 객체의 namelocation을 직접 포함합니다. 그러나 opening_hours 필드의 값은 더 복잡합니다.
  • (.opening_hours | if . == "24 hours" then "Open 24 hours" else "Open \(.)" end)는 원래 opening_hours의 값을 가져와 처리합니다.
    • .opening_hours는 원래 운영 시간 값을 선택합니다.
    • if . == "24 hours" then "Open 24 hours" else "Open \(.)" end 문은 원래 opening_hours가 정확히 "24 hours"와 같은지 확인합니다. 그렇다면 값은 "Open 24 hours"로 바뀝니다. 그렇지 않은 경우 "Open "이 기존 opening_hours에 접두사로 추가됩니다. 문자열 내에 값을 포함할 수 있게 해주는 \(.)의 사용에 유의하십시오.

본질적으로, 이 명령은 각 명소에 대해 새 객체를 생성하고 opening_hours 값을 사용자가 더 읽기 쉽도록 조정하여 데이터를 변환합니다.

요약

축하합니다! Linux jq 프로그래밍 랩을 성공적으로 완료했습니다. 명령줄에서 직접 구조화된 데이터를 처리하는 강력한 도구인 jq를 사용하여 JSON 데이터를 쿼리, 필터링 및 변환하는 방법을 배웠습니다. API, 구성 파일 또는 기타 JSON 소스에서 데이터를 처리하든, jq는 필요한 데이터를 매우 효율적이고 명확하게 추출, 필터링 및 조작할 수 있도록 지원합니다.

jq 및 기타 명령줄 도구를 마스터하려면 꾸준한 연습이 필수적입니다. 자신만의 JSON 데이터를 사용하여 다양한 쿼리와 변환을 시도해 보십시오. 즐거운 코딩 되세요!