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