LoginSignup
10
6

More than 5 years have passed since last update.

jqのフィルタのサンプルコード

Last updated at Posted at 2017-05-14

jqの使い方を覚えるために実際サンプルコードを書いてみる。

オフィシャルマニュアルとちょっと表記が違うので注意。(各フィルタタイトルに「.」をつけてない。)

フィルタ別のサンプルコード

〈入力〉.〈出力〉

標準入力、または左側のJSONをそのまま出力する(と理解している)。

echo '{"john": "paul"}' | jq '.'
{
  "john": "paul"
}

〈入力〉[]〈出力〉

入力したJSONから外側の[]を外して出力する。
入力したJSONの配列から要素を取り出す。

$ echo '[40,74,58]' | jq '.[]'
40
74
58

入力したJSONから外側の{}を外して出力する。
入力したJSONのハッシュから要素の値を取り出す。キーは捨てる。

$ echo '{ "john":{"name": "John"}, "paul":{"name": "Paul"}}' \
 | jq '.[]'
{
  "name": "John"
}
{
  "name": "Paul"
}

$ echo '{ "john":{"name": "John"}, "paul":{"name": "Paul"}}' \
 | jq '.[][]'
"John"
"Paul"

[〈入力〉]〈出力〉

入力した値の外側に[]をつけて出力する。
新しい配列を作り、入力した値を配列の要素とする。

例1

$ echo '{"john": 40, "paul": 74}' | jq '[.]'
[
  {
    "john": 40,
    "paul": 74
  }
]

例2

$ echo '{"john": 40, "paul": 74}' | jq '.[]'
40
74

$ echo '{"john": 40, "paul": 74}' | jq '[.[]]'
[
  40,
  74
]

例3

$ echo '[74, 58]' | jq '[40, .[], 76]'
[
  40,
  74,
  58,
  76
]

〈入力〉["〈キー名〉"]〈出力〉

入力したJSONから指定されたキーを持つ要素の値を出力する。該当要素がなければnullを出力する。

例1

$ echo '{"john": { "name": "John", "old": 40}, \
 "paul": { "name": "Paul", "old": 74}}' \
 | jq '.["john"]'
{
  "name": "John",
  "old": 40
}

$ echo '{"john": { "name": "John", "old": 40}, \
 "paul": { "name": "Paul", "old": 74}}' \
 | jq '.["john"]["old"]'
40

例2

$ echo '{"john": { "name": "John", "old": 40}, \
 "paul": { "name": "Paul", "old": 74}}' \
 | jq '.[]["name"]'
"John"
"Paul"

〈入力〉.〈キー名〉〈出力〉

〈入力〉["〈キー名〉"]〈出力〉と同じ。

例1

$ echo '{"john": { "name": "John", "old": 40}, \
 "paul": { "name": "Paul", "old": 74}}' \
 | jq '.john'
{
  "name": "John",
  "old": 40
}

$ echo '{"john": { "name": "John", "old": 40}, \
 "paul": { "name": "Paul", "old": 74}}' \
 | jq '.john.old'
40

例2

$ echo '{"john": { "name": "John", "old": 40}, \
 "paul": { "name": "Paul", "old": 74}}' \
 | jq '.[].name'
"John"
"Paul"

{〈入力〉}〈出力〉

入力したキー名、値の外側に{}をつけて出力する。
新しいオブジェクトを作り、入力したキー名、値を要素とする。

$ echo '{"part":"Vocal"}' | jq '{"john": .[]}'
{
  "john": "Vocal"
}

キーと値がそれぞれ配列の場合、その要素の組み合わせ分だけオブジェクトを作成するのが面白い。

例1

$ echo '{"names":["John","Paul"]}' | jq '{"vocal": .names[]}'
{
  "vocal": "John"
}
{
  "vocal": "Paul"
}

例2

$ echo '{"names": ["John","Paul", "George"], \
 "parts":["Vocal","Base"]}' \
 | jq '{(.names[]): .parts[]}'
{
  "John": "Vocal"
}
{
  "John": "Base"
}
{
  "Paul": "Vocal"
}
{
  "Paul": "Base"
}
{
  "George": "Vocal"
}
{
  "George": "Base"
}

「(.names[])」の「()」は、書いておかないと展開してくれないらしい。

〈入力〉[〈インデックス〉]〈出力〉

入力したJSONの配列からインデックスの要素を取り出して出力する。

echo '[40, 74, 58, 76]' | jq '.[0]'
40

$ echo '[40, 74, 58, 76]' | jq '.[1]'
74

$ echo '[40, 74, 58, 76]' | jq '.[2]'
58

$ echo '[40, 74, 58, 76]' | jq '.[3]'
76

負の値を指定すると配列の末尾から探す。

$ echo '[40, 74, 58, 76]' | jq '.[-1]'
76

$ echo '[40, 74, 58, 76]' | jq '.[-2]'
58

$ echo '[40, 74, 58, 76]' | jq '.[-3]'
74

$ echo '[40, 74, 58, 76]' | jq '.[-4]'
40

〈入力〉[〈インデックス1〉:〈インデックス2〉]〈出力〉

入力したJSONの配列からインデックス1以上、インデックス2未満の要素を取り出して出力する。

$ echo '[40, 74, 58, 76]' | jq '.[1:2]'
[
  74
]

$ echo '[40, 74, 58, 76]' | jq '.[1:3]'
[
  74,
  58
]

インデックス1を省略すると開始インデックスが先頭になる。

$ echo '[40, 74, 58, 76]' | jq '.[:1]'
[
  40
]

$ echo '[40, 74, 58, 76]' | jq '.[:2]'
[
  40,
  74
]

$ echo '[40, 74, 58, 76]' | jq '.[:3]'
[
  40,
  74,
  58
]

インデックス2を省略すると終了インデックスが末尾になる。

$ echo '[40, 74, 58, 76]' | jq '.[1:]'
[
  74,
  58,
  76
]

$ echo '[40, 74, 58, 76]' | jq '.[2:]'
[
  58,
  76
]

インデックス1、インデックス2共に負の値をして可能。(どうなるかはめんどくさいから調べない。)

〈フィルタ1〉,〈フィルタ2〉

複数のフィルタの結果を連結して出力する。

例2

echo '{"john": { "name": "John", "old": 40}, \
 "paul": { "name": "Paul", "old": 74}}' \
 | jq '.[].name,.[].old'
"John"
"Paul"
40
74

$ echo '{"john": { "name": "John", "old": 40}, \
 "paul": { "name": "Paul", "old": 74}}' \
 | jq '[.[].name],[.[].old]'
[
  "John",
  "Paul"
]
[
  40,
  74
]

$ echo '{"john": { "name": "John", "old": 40}, \
 "paul": { "name": "Paul", "old": 74}}' \
 | jq '[.[].name,.[].old]'
[
  "John",
  "Paul",
  40,
  74
]

〈フィルタ1〉|〈フィルタ2〉

フィルタの結果にフィルタをかける。
フィルタ2にはフィルタ1の結果を受ける「.」が必要となる(と理解している。)
フィルタ1の結果が複数箇所必要になる時に使うっぽい。

$ echo '{"john": { "name": "John", "old": 40}, \
 "paul": { "name": "Paul", "old": 74}}' \
 | jq '.[] | .["name"], .["old"]'
"John"
40
"Paul"
74
10
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
6