Linux

리눅스 명령어 2. jq란?

Somaz 2024. 1. 19. 00:14
728x90
반응형

Overview

 

jq 명령어 대해서 알아보자.

  • JSON 데이터를 다루는 작업이 흔해짐에 따라, 커맨드라인에서 직접 JSON을 처리할 수 있는 도구가 필요하다.
  • `jq`는 다양한 시스템에서 JSON 형식의 데이터를 처리할 때 필수적인 유틸리티로 사용된다.

출처 : https://ioflood.com/blog/install-jq-command-linux

 

 


jq란?

jq는 JSON 형식의 데이터를 처리하기 위한 커맨드라인 기반의 프로그램이다.

JSON 데이터를 필터링, 매핑, 감소(reduce) 및 변환하는 다양한 연산을 수행할 수 있다.

jq는 작고 가벼워 대부분의 운영체제에서 쉽게 설치하고 사용할 수 있다.

echo '{"name":"Somaz"}' | jq '.name'

# Output
"Somaz"

jq 설치 및 사용법

 

jq 설치

# apt
sudo apt-get update
sudo apt-get install jq

# apt(select version)
sudo apt-get install jq=1.5*

# yum
sudo yum install jq

# yum(select version)
sudo yum install jq-1.5

# dnf
sudo dnf install jq

# source code
git clone <https://github.com/stedolan/jq.git>
cd jq
autoreconf -i
./configure
make
sudo make install

# source code(select version)
git clone <https://github.com/stedolan/jq.git>
cd jq
git checkout jq-1.5
autoreconf -i
./configure
make
sudo make install

 

 

jq 사용법

 

`jq —help` 명령어를 사용하면 사용법에 대해서 알 수 있다.

jq --help

jq - commandline JSON processor [version 1.6]

Usage:  jq [options]  [file...]
        jq [options] --args  [strings...]
        jq [options] --jsonargs  [JSON_TEXTS...]

jq is a tool for processing JSON inputs, applying the given filter to
its JSON text inputs and producing the filter's results as JSON on
standard output.

The simplest filter is ., which copies jq's input to its output
unmodified (except for formatting, but note that IEEE754 is used
for number representation internally, with all that that implies).

For more advanced filters see the jq(1) manpage ("man jq")
and/or <https://stedolan.github.io/jq>

Example:

        $ echo '{"foo": 0}' | jq .
        {
                "foo": 0
        }

Some of the options include:
  -c               compact instead of pretty-printed output;
  -n               use `null` as the single input value;
  -e               set the exit status code based on the output;
  -s               read (slurp) all inputs into an array; apply filter to it;
  -r               output raw strings, not JSON texts;
  -R               read raw strings, not JSON texts;
  -C               colorize JSON;
  -M               monochrome (don't colorize JSON);
  -S               sort keys of objects on output;
  --tab            use tabs for indentation;
  --arg a v        set variable $a to value ;
  --argjson a v    set variable $a to JSON value ;
  --slurpfile a f  set variable $a to an array of JSON texts read from ;
  --rawfile a f    set variable $a to a string consisting of the contents of ;
  --args           remaining arguments are string arguments, not files;
  --jsonargs       remaining arguments are JSON arguments, not files;
  --               terminates argument processing;

Named arguments are also available as $ARGS.named[], while
positional arguments are available as $ARGS.positional[].

 

기본 사용법

# 단일 요소 출력
echo '{"name": "Somaz", "age": 31}' | jq '.name'
# Output
"Somaz"

# 전체 객체 출력
echo '{"name": "Somaz", "age": 31}' | jq '.'
# Output
{
  "name": "Somaz",
  "age": 31
}

# 특정 키로 필터링
echo '[{"name": "Somaz", "age": 31}, {"name": "오9Lee", "age": 28}]' | jq '.[] | select(.age < 30)'
# output
{
  "name": "오9Lee",
  "age": 28
}

# 오징어 필터링
echo '[{"name": "오9Lee", "face": "오징어"}, {"name": "오9Lee", "face": "갑오징어"}]' | jq '.[] | select(.face | test("^오징어"))'
# output
{
  "name": "오9Lee",
  "face": "오징어"
}

# 오징어 포함된 모든 사람 필터링
echo '[{"name": "전산직", "face": "오징어"}, {"name": "오9Lee", "face": "갑오징어"}]' | jq '.[] | select(.face | test("오징어"))'
# output
{
  "name": "오9Lee",
  "face": "오징어"
}
{
  "name": "오9Lee",
  "face": "갑오징어"
}

 

고급 필터

# 매핑과 변환
echo '[{"name": "Somaz", "age": 31}, {"name": "오9Lee", "age": 28}]' | jq '.[] | {personName: .name, yearOfBirth: (2024 - .age + 1)}'
# output(Korean age)
{
  "personName": "Somaz",
  "yearOfBirth": 1994
}
{
  "personName": "오9Lee",
  "yearOfBirth": 1997
}

# 조건부 출력
echo '[{"name": "Somaz", "age": 31}, {"name": "오9Lee", "age": 28}]' | jq 'map(if .age > 30 then .name else empty end)'
# output
[
  "Somaz"
]

 

유용한 옵션

 

-r (Raw Output): 출력 결과에서 따옴표를 제거한다.

echo '{"name": "Somaz", "age": 31}' | jq -r '.name'
# output
Somaz

 

-c (Compact Output): 각 JSON 객체를 한 줄로 압축하여 출력한다.

echo '[{"name": "Somaz", "age": 31}, {"name": "오9Lee", "age": 25}]' | jq -c '.[]'
# output
{"name":"Somaz","age":31}
{"name":"오9Lee","age":25}

 

--arg (Arguments): 스크립트에 외부에서 변수를 전달한다.

# data.json 생성
cat <<EOF > data.json
[
  {"name": "Somaz", "age": 31},
  {"name": "Jane", "age": 25},
  {"name": "Doe", "age": 22},
  {"name": "John", "age": 45}
]
EOF

jq --arg name "Somaz" '.[] | select(.name == $name)' data.json
# output
{
  "name": "Somaz",
  "age": 31
}

 

 


Reference

https://ioflood.com/blog/jq-linux-command/

https://ioflood.com/blog/install-jq-command-linux/

728x90
반응형

'Linux' 카테고리의 다른 글

Vim 개념 및 사용가이드  (0) 2024.05.14
리눅스 명령어 3. sed, awk란?  (0) 2024.01.20
리눅스 명령어 1. xargs란?  (0) 2024.01.16
Chattr 이란?  (0) 2022.07.25
CentOS 7 / 계정에 sudo 권한 주기  (0) 2022.04.28