12 Ekim 2020 Pazartesi

jq komutu - JSON processor

Giriş
Açıklaması şöyle
... jq is a command-line tool for parsing and manipulating JSON data. It is written in C and has a lightweight, minimalistic and flexible syntax. It allows you to filter, extract, and transform JSON data quickly and easily, making it a powerful tool for data processing and analysis.

jq was created by Steve Kemp. He started working on jq in early 2011, and the first version was released in April of that year. The tool quickly gained popularity among developers and data analysts, and it has since become one of the most widely used command-line JSON processors.
jq Filters
Açıklaması şöyle
jq reads JSON data from input and applies a series of filters to it, producing one or more outputs. The filters are written in a domain-specific language (DSL) that is similar to the one used in functional programming languages like Haskell, Lisp and Ruby.
Açıklaması şöyle
jq supports a wide range of filter types that can be used to select, extract, and modify JSON data, common ones are:

Selectors: Select specific parts of JSON data.
Functions: Built-in functions that can be used to perform various operations on the input JSON data.
Operators: Used to perform mathematical, logical, and comparison operations on the input JSON data.
Pipe: Used to connect multiple filters together, where the output of one filter is passed as input to the next filter.
jq Data Types
Açıklaması şöyle
jq supports several types of data, including:

Numbers: Integers and floating-point values, such as 42, 3.14, and -2.
Strings: Text enclosed in double quotes, such as “hello world”.
Booleans: true and false.
Arrays: Lists of values enclosed in square brackets, such as [1, 2, 3].
Objects: Key-value pairs enclosed in curly braces, such as {“name”: “Tony”, “age”: 100}.
Null: The special value null.
jq Regular Expression
Açıklaması şöyle
jq uses the Oniguruma regular expression library, as do php, ruby, TextMate, Sublime Text, etc, so the description here will focus on jq specifics.

The jq regex filters are defined so that they can be used using one of these patterns:

STRING | FILTER( REGEX )
STRING | FILTER( REGEX; FLAGS )
STRING | FILTER( [REGEX] )
STRING | FILTER( [REGEX, FLAGS] )
Örnek
Şöyle yaparız
$ cat file.json | jq '.[] | select(.email | test("^[a-z]+@"))'

$ cat file.json | jq '.[] | select(.email | test("^[a-z]+@") | not)'

Örnek
Pretty print için şöyle yaparız
kubectl get 
  --raw "..." 
  | jq .
Örnek
Şöyle yaparız
$ echo '{"name": "Tony", "age": 100}' | jq .
{
  "name": "Tony",
  "age": 100
}
Identifier Yani Key
Örnek
Şöyle yaparız
$ echo '{"foo": 42, "bar": "less interesting data"}'  | jq '.foo'
42
İsimli Array
Örnek
Elimizde şöyle bir JSON olsun
{
  "DBClusterSnapshots": [
    {
      ...
      "Status": "copying",
      ...
    }
  ]
}
Status alanına erişmek için şöyle yaparız
jq -r .DBClusterSnapshots[0].Status
Bir diğer seçenek olarak Şöyle yaparız
jshon -e DBClusterSnapshots -e 0 -e Status -u
İsimsiz Array
.[N] veya .[N] şeklinde kullanılır. Array'in içindeki bir alana erişmek için .[].keyname şeklinde kullanılır
Örnek
Şöyle yaparız
$ echo '[1, 2, 3]' | jq '.[1]'
2
Örnek
Şöyle yaparız
$ echo '[{"name": "Tony", "age": 100}, {"name": "Jane", "age": 25}]' | jq '.[].name'
"Tony"
"Jane"
Örnek
Elimizde şöyle bir kod olsun. url kısmı önemli değil.
~ curl -X GET -H "Accept: application/vnd.kafka.avro.v2+json" \
      http://localhost:... | jq

[
  {
    "topic": "movies",
    "key": null,
    "value": {
      "id": 294,
      "title": "Die Hard",
      "release_year": 1988
    },
    "partition": 0,
    "offset": 0
  },
  ...
]
Bu çıktıdan sadece "title" ve "release year" alanlarını isteyelim. Şöyle yaparız. İsmisiz array nesnesinin içindeki tüm title vs gibi alanlara erişilir
~ curl -X GET -H "Accept: application/vnd.kafka.avro.v2+json" \
      http://localhost:... | jq \
      | jq '.[] | {title: .value.title, year: .value.release_year}'

{
  "title": "Die Hard",
  "year": 1988
}
{
  "title": "Tree of Life",
  "year": 2011
}
{
  "title": "A Walk in the Clouds",
  "year": 1995
}
{
  "title": "The Big Lebowski",
  "year": 1998
}
{
  "title": "Super Mario Bros.",
  "year": 1993
}
{
  "title": "Chariots of Fire",
  "year": 1981
}
keys function
Örnek
Şöyle yaparız
$ echo '{"name": "Tony", "age": 100}' | jq 'keys'
[
  "age",
  "name"
]
length function
Örnek
Şöyle yaparız
$ echo '[1, 2, 3]' | jq 'length'
3
to_entries function
Örnek
Şöyle yaparız
$ echo '{"name": "Tony", "age": 100}' | jq 'to_entries | .[] | .value'
"Tony"
100
Conditionals and Comparisons
select(.keyname) şeklindedir

Örnek
Şöyle yaparız
$ cat file.json | jq '.[] | select(.name == "Tony")'

$ cat file.json | jq '.[] | select(.age > 100)'

$ cat file.json | jq '.[] | select(.age >= 100)'

$ cat file.json | jq '.[] | select(.age > 100 and .gender == "male")'

$ cat file.json | jq '.[] | select(.age > 100 or .gender == "female")'
--args seçeneği
array oluşturur
Örnek
Şöyle yaparız
{
jq -n --arg key APP-Service1-Admin '{($key): $ARGS.positional}' --args a b jq -n --arg key APP-Service1-View '{($key): $ARGS.positional}' --args c d } // Output { "APP-Service1-Admin": [ "a", "b" ] } { "APP-Service1-View": [ "c", "d" ] }

--join-output seçeneği
Örnek
Şöyle yaparız
$ ip -details -json link show | jq --join-output '...'
-r seçeneği 
Şöyle yaparız
jq -r '.Policy'

Hiç yorum yok:

Yorum Gönder