Linux에서 jq 명령을 사용하여 JSON을 처리하는 방법
Jq는 파일 및 UNIX 파이프에서 JSON 데이터를 스트리밍하고 필터링할 수 있는 강력하고 매우 유연한 파서 프로그램입니다. 이 기사에서는 jq의 기본 사항, 현재 코드 예제는 물론 지금 설치할 수 있는 몇 가지 대체 구현에 대해 설명합니다.
jq는 무엇에 사용되나요?
jq 의 가장 일반적인 용도는 SaaS(Software-as-a-Service) API의 JSON 응답을 처리하고 조작하는 것입니다. 예를 들어 cURL과 함께 jq를 사용하여 Digitalocean의 API 엔드포인트를 활용하여 계정 세부정보를 얻을 수 있습니다.
그 외에도 jq는 대용량 JSON 파일을 관리하는 강력한 유틸리티이기도 합니다. MongoDB, PostgreSQL, MySQL 등 오늘날 가장 널리 사용되는 일부 데이터베이스 프로그램은 데이터를 저장하는 방법으로 JSON을 지원합니다. 따라서 jq를 배우면 해당 데이터베이스 시스템의 작동 방식을 이해하는 데 도움이 됩니다.
jq 설치 및 사용
jq를 시작하려면 시스템에 바이너리 패키지를 설치하세요.
jq를 테스트할 수 있는 개방형 API 엔드포인트를 찾으세요. 제 경우에는 ipinfo.io의 IP checker API를 사용하겠습니다.
jq의 가장 기본적인 필터는 도트(.) 필터입니다. 그러면 jq가 표준 입력에서 수신한 대로 JSON 응답이 인쇄됩니다.
또 다른 기본 필터는 파이프(|) 기호입니다. 이는 한 필터의 출력을 다른 필터의 입력으로 전달하는 특수 필터입니다.
파이프 연산자 뒤의 값은 “Object Identifier-Index”입니다. 그러면 JSON 입력에서 텍스트와 일치하는 변수를 검색하고 해당 값을 터미널에 인쇄합니다. 이 경우에는 “ip:” 키의 값을 찾고 있습니다.
기본 사항을 완료하고 정리한 후 다음 섹션에서는 jq를 사용하여 수행할 수 있는 몇 가지 요령을 보여줍니다.
1. jq를 사용하여 기본 피드 리더 만들기
오늘날 대부분의 최신 웹사이트는 플랫폼 내부의 데이터를 읽을 수 있는 개방형 API 엔드포인트를 제공합니다. 예를 들어 모든 Github 저장소에는 해당 프로젝트의 최신 커밋과 문제를 검색할 수 있는 자체 API URL이 있습니다.
jq와 함께 이와 같은 API 엔드포인트를 사용하여 자신만의 간단한 “RSS와 같은” 피드를 만들 수 있습니다. 시작하려면 cURL을 사용하여 엔드포인트가 제대로 작동하는지 테스트하세요.
피드의 첫 번째 항목을 인쇄하려면 다음을 실행하세요.
Github API가 jq로 보내는 다양한 필드가 표시됩니다. 이를 사용하여 중괄호( {}
) 필터에 입력을 연결하여 사용자 정의 JSON 객체를 생성할 수 있습니다.
중괄호 안에 쉼표(,) 필터를 추가하면 사용자 정의 개체에 여러 필드를 추가할 수 있습니다.
대괄호 안의 “0”을 제거하면 jq 필터가 전체 피드에 적용됩니다.
또한 작은 Bash 스크립트를 만들어 즐겨 사용하는 Github 프로젝트의 최신 문제를 표시할 수도 있습니다. 빈 셸 스크립트 파일 안에 다음 코드 블록을 붙여넣습니다.
파일을 저장한 후 다음 명령을 실행하여 실행 가능하게 만듭니다.
즐겨찾는 Github 저장소에 최신 문제를 나열하여 새로운 피드 리더를 테스트하세요.
2. JSON 데이터베이스를 통한 읽기 및 검색
API에서 데이터를 읽는 것 외에도 jq를 사용하여 로컬 시스템에서 JSON 파일을 관리할 수도 있습니다. 선호하는 텍스트 편집기를 사용하여 간단한 JSON 데이터베이스 파일을 생성하는 것부터 시작하세요.
다음 데이터 블록을 파일 안에 붙여넣은 후 저장하세요.
데이터베이스 배열의 첫 번째 객체를 인쇄하여 jq가 JSON 파일을 제대로 읽는지 테스트합니다.
“객체 식별자-색인” 필터를 사용하여 JSON 데이터베이스에 대한 쿼리를 만듭니다. 제 경우에는 데이터베이스의 모든 항목에서 “.name” 키 값을 검색하고 있습니다.
또한 jq의 내장 기능 중 일부를 사용하여 특정 품질을 기준으로 쿼리를 필터링할 수도 있습니다. 예를 들어, “.name” 값이 6자 이상인 모든 JSON 객체를 검색하고 인쇄할 수 있습니다.
jq를 사용하여 JSON 데이터베이스에서 작업
게다가 jq는 기본 스프레드시트와 유사한 JSON 데이터베이스에서 작동할 수 있습니다. 예를 들어, 다음 명령은 데이터베이스의 모든 개체에 대한 “.balance” 키의 합계를 인쇄합니다.
쿼리에 조건문을 추가하여 이를 확장할 수도 있습니다. 다음은 두 번째 개체의 “.name” 값이 “Alice”인 경우에만 “.balance”를 추가합니다.
JSON 데이터베이스에서 변수를 일시적으로 제거할 수 있습니다. 이는 필터를 테스트하고 데이터 세트를 계속 처리할 수 있는지 확인하려는 경우에 유용할 수 있습니다.
“+” 연산자를 사용하여 데이터베이스에 새 변수를 삽입할 수도 있습니다. 예를 들어, 다음 줄은 데이터베이스의 첫 번째 개체에 “active: true” 변수를 추가합니다.
3. jq에서 JSON이 아닌 데이터 변환
jq의 또 다른 뛰어난 기능은 JSON이 아닌 데이터를 받아들이고 작업할 수 있다는 것입니다. 이를 달성하기 위해 프로그램은 공백과 줄 바꿈으로 구분된 데이터를 JSON 배열로 변환하는 대체 “소리 모드”를 사용합니다.
플래그 를 사용하여 데이터를 jq에 파이프하여 이 기능을 활성화할 수 있습니다 -s
.
원시 데이터를 배열로 변환하면 배열 인덱스 번호를 사용하여 주소를 지정할 수 있다는 장점이 있습니다. 다음 명령은 변환된 배열 위치를 참조하여 두 개의 값을 추가합니다.
이 배열 위치를 더 자세히 살펴보고 그 주위에 새로운 JSON 코드를 구성할 수 있습니다. 예를 들어, 다음 코드는 중괄호 필터를 통해 echo 명령의 텍스트를 JSON 객체로 변환합니다.
원시 데이터를 가져오는 것 외에도 jq는 JSON이 아닌 데이터를 출력으로 반환할 수도 있습니다. 이는 더 큰 쉘 스크립트의 일부로 jq를 사용하고 해당 필터의 결과만 필요한 경우에 유용합니다.
그렇게 하려면 jq를 실행한 다음 플래그를 실행하세요 -r
. 예를 들어, 다음 명령은 내 데이터베이스 파일에서 모든 이름을 읽고 이를 일반 텍스트 데이터로 반환합니다.
jq에 대한 대체 JSON 파서
jq의 코드는 오픈 소스이므로 다양한 개발자가 자신만의 JSON 파서 버전을 만들었습니다. 이들 각각에는 jq의 핵심 부분을 개선하거나 변경하는 고유한 판매 포인트가 있습니다.
1. 좋아요
Jaq 는 jq와 거의 동일한 기능 세트를 제공하는 강력한 JSON 파서입니다.
Rust로 작성된 Jaq의 가장 큰 판매 포인트 중 하나는 이전 버전과의 호환성을 유지하면서 원래 파서보다 최대 30배 빠르게 jq 언어를 실행할 수 있다는 것입니다. 이것만으로도 대규모 jq 필터를 실행하고 시스템의 성능을 최대화하려는 경우 가치가 있습니다.
즉, jaq의 한 가지 단점은 현재 Debian, Ubuntu 및 Fedora 리포지토리에서 사용할 수 없다는 것입니다. 이를 얻는 유일한 방법은 Homebrew를 다운로드하거나 소스에서 컴파일하는 것입니다.
2. 가다
Gojq는 전적으로 Go로 작성된 대체 JSON 파서입니다. 거의 모든 플랫폼에 설치할 수 있는 액세스 가능하고 사용하기 쉬운 jq 버전을 제공합니다.
원래 jq 프로그램은 오류 메시지가 엄청나게 간결할 수 있습니다. 결과적으로 새로운 jq 사용자에게는 jq 스크립트 디버깅이 특히 어렵습니다. Gojq는 스크립트에서 실수가 있는 위치를 보여주고 발생한 오류 종류에 대한 자세한 메시지를 제공하여 이 문제를 해결합니다.
gojq의 또 다른 판매 포인트는 JSON과 YAML 파일을 모두 읽고 처리할 수 있다는 것입니다. 이는 Docker 및 Docker Compose 사용자이고 배포 워크플로를 자동화하려는 경우 특히 유용할 수 있습니다.
Gojq의 가장 큰 문제는 원래 jq 파서에 기본적으로 제공되는 일부 기능을 제거했다는 것입니다. 예를 들어 --ascii-output
, --seq
, 및 같은 옵션은 --sort-keys
gojq에 존재하지 않습니다.
3. FQ
jaq 및 gojq와 달리 fq는 텍스트와 바이너리 데이터를 모두 구문 분석할 수 있는 포괄적인 소프트웨어 툴킷입니다. JSON, YAML, HTML, FLAC 등 널리 사용되는 다양한 형식과 함께 작동할 수 있습니다.
fq의 가장 큰 특징은 파일용 16진수 판독기가 내장되어 있다는 것입니다. 따라서 파일이 어떻게 만들어졌는지, 파일에 문제가 있는지 확인하기 위해 파일의 내부 구조를 살펴보는 것이 쉽습니다. 그 외에도 fq는 텍스트를 처리할 때 jq에 대해 동일한 구문을 사용하므로 이미 jq에 익숙한 사람이라면 누구나 쉽게 배울 수 있습니다.
이 야심찬 목표의 한 가지 단점은 fq가 여전히 개발 중이라는 것입니다. 따라서 프로그램의 일부 기능과 동작은 여전히 전면적으로 변경될 수 있습니다.
jq를 탐색하고, 작동 방식과 이를 특별하게 만드는 것은 컴퓨터에서 프로그램을 만드는 방법을 배우는 첫 번째 단계일 뿐입니다. 쉘 프로그래밍의 기본 사항을 읽고 놀라운 코딩 세계에 대해 자세히 알아보세요.
이미지 크레디트: Unsplash를 통한 Ferenc Almasi . 모든 변경 사항과 스크린샷은 Ramces Red가 작성했습니다.
답글 남기기