λ沢.dev

lambdasawa.dev


Project maintained by lambdasawa Hosted on GitHub Pages — Theme by mattgraham

jq

filter

$ echo '[{ "n": 1 }, { "n": 2 }, { "n": 3 }]' | jq '.[] | select(.n % 2 == 0)'
{
  "n": 2
}

map

$ echo '[{ "n": 1 }, { "n": 2 }, { "n": 3 }]' | jq 'map(.n * 10)'
[
  10,
  20,
  30
]

filter の flatten しないやつ

$ echo '[{ "n": 1 }, { "n": 2 }, { "n": 3 }]' | jq 'map(select(.n % 2 == 0))'
[
  {"n": 2}
]

JSON lines を配列として読み取る

$ printf '{"foo": 1}\n{"foo": 2}' | jq -s '.'
[
  {"foo": 1},
  {"foo": 2}
]

printf, string format, string template

$ echo '[{ "n": 1 }, { "n": 2 }, { "n": 3 }]' | jq 'map("n => \(.n + 1)")'
[
  "n => 2",
  "n => 3",
  "n => 4"
]

string join

$ echo '[{ "n": 1 }, { "n": 2 }, { "n": 3 }]' | jq -r 'map(.n) | join(",")'
1,2,3

string split

$ echo -n foo,bar,baz | jq -R 'split(",")'
[
  "foo",
  "bar",
  "baz"
]

regexp

$ curl -sSL https://api.github.com/users/lambdasawa/repos | jq 'map(select(.name | test("lambda(?!sawa)")) | .name)'
[
  "aws-lambda-versions"
]

合計 (配列)

$ echo '[{ "n": 1 }, { "n": 2 }, { "n": 3 }]' | jq 'map(.n) | add'
6

合計 (line separated string)

$ seq 10 | jq -s add
55

配列の長さ

$ echo '[{ "n": 1 }, { "n": 2 }, { "n": 3 }]' | jq 'length'
3

平均

$ echo '[{ "n": 1 }, { "n": 2 }, { "n": 3 }]' | jq 'map(.n) as $ns | ($ns | add) / ($ns | length)'
2

先頭3個

$ echo '[1,2,3,4,5,6,7,8,9,10]' | jq 'limit(3; .[])'
1
2
3

末尾3個

$ echo '[1,2,3,4,5,6,7,8,9,10]' | jq 'limit(3; reverse | .[])'
10
9
8

要素の追加と削除

$ echo '{"a": 1, "b": 2}' | jq '.foo = "bar" | del(.b)'
{
  "a": 1,
  "foo": "bar"
}

環境変数にアクセス

$ jq -nr 'env.USER'
lambdasawa

コマンドラインで変数を渡す

$ jq -n --arg FOO bar '{ foo: $FOO }'
{
  "foo": "bar"
}

JSONデコード

$ echo '{"data": "{\\"data\\": 1}"}' | jq '.data | fromjson'
{
  "data": 1
}

URIエンコード

$ echo -n aiuえお | jq -Rr @uri
aiu%E3%81%88%E3%81%8A

URIデコード

jq には URI デコードをするコマンドはない。 Node.js でやるとしたら以下。

$ echo -n aiu%E3%81%88%E3%81%8A | node -e 'console.log(decodeURIComponent(require("fs").readFileSync("/dev/stdin", "utf-8")))'
aiuえお

JSON 組み立て

$ jq -n --arg FOO hoge --argjson BAR 1 '$ARGS.named'
{
  "FOO": "hoge",
  "BAR": 1
}

fizzbuzz

jq -rn 'range(1;100+1) | if . % 15 == 0 then "fizzbuzz" elif . % 3 == 0 then "fizz" elif . % 5 == 0 then "buzz" else . end'

Cookbook

コマンドライン引数で JSON を組み立て

jq -n \
  --arg HOGE_API_KEY foo \
  --arg FUGA_API_KEY bar \
  '$ARGS.named'

環境変数を JSON にする

jq -n 'env | {HOME, PWD}'

.env ファイルを JSON にする

jc にも依存する。

cat .env | jc --env | jq 'from_entries'

一部の値だけ。

cat .env | jc --env | jq 'from_entries | {FOO_API_KEY}'

EC2 をインスタンス名で絞って表示

aws ec2 describe-instances |\
  jq -r '.Reservations[] | .Instances[] | select(.Tags[] | .Key == "Name" and .Value == "test") | .InstanceId'

EC2 一覧を TSV で表示する

aws ec2 describe-instances |\
  jq -r '.Reservations[] | .Instances[] | [.InstanceId, (.Tags[] | select(.Key == "Name") | .Value)] | @tsv'