jqコマンド覚え書き

2021年4月9日

jqコマンド

JSON から必要なものを取り出すときに使う jq コマンド。使い方をすぐ忘れてしまって毎回 jq Manual を見ているので、よく使うフィルタをメモしておきます。jq のバージョンは 1.6。随時更新。

目次

  1. サンプルの JSON 準備
  2. JSON をフォーマット
  3. 配列の中身をすべて取り出す
  4. 特定の配列の要素を取り出す
  5. キーを指定して値を取り出す
  6. 複数の値を取り出す
  7. ダブルクォーテーションを消す
  8. CSV 形式で出力する
  9. TSV 形式で出力する
  10. 絞り込み検索をする
  11. and/or 検索
  12. 正規表現で検索
  13. 文字列の結合
  14. null 入力
  15. 集計
  16. 日付のフォーマット変更とタイムゾーン変更

サンプルの JSON 準備

サンプルとして以下の JSON を使います。ターミナルで以下のコマンドを実行して $JSON という変数に入れておきます。

JSON=$(cat << EOS
[
  {
    "Address": "192.168.0.1",
    "ID": "1",
    "Name": "foo",
    "Version": "1.0.0",
    "Status": "ready"
  },
  {
      "Address": "192.168.0.2",
      "ID": "2",
      "Name": "bar",
      "Version": "1.0.1",
      "Status": "down"
  },
  {
      "Address": "192.168.0.3",
      "ID": "3",
      "Name": "buz",
      "Version": "2.0.0",
      "Status": "ready"
  }
]
EOS
)

JSON をフォーマット

一番単純なフィルタである . を使って JSON をフォーマットできます。改行やスペースが入っていなくて JSON が見づらい場合などに使えます。

例えばサンプルの JSON のスペースと改行を取り除くとこんな感じで見づらいですが

echo $JSON | tr -d '\n '
[{"Address":"192.168.0.1","ID":"1","Name":"foo","Version":"1.0.0","Status":"ready"}, ...

jq コマンドでJSON を再フォーマットするときれいな出力になります。

echo $JSON | tr -d '\n ' | jq '.'
[
  {
    "Address": "192.168.0.1",
    "ID": "1",
    "Name": "foo",
    "Version": "1.0.0",
    "Status": "ready"
  },
...

配列の中身をすべて取り出す

サンプルの JSON は全体が配列で囲まれています。.[]と指定することで配列の要素をすべて取り出すことができます。

echo $JSON | jq '.[]'
{
  "Address": "192.168.0.1",
  "ID": "1",
  "Name": "foo",
  "Version": "1.0.0",
  "Status": "ready"
}
{
  "Address": "192.168.0.2",
  "ID": "2",
  "Name": "bar",
  "Version": "1.0.1",
  "Status": "down"
}
...

特定の配列の要素を取り出す

.[0]のように配列の添字(インデックス)を指定すると、指定した配列の要素を取り出すことができます。

echo $JSON | jq '.[0]'
{
  "Address": "192.168.0.1",
  "ID": "1",
  "Name": "foo",
  "Version": "1.0.0",
  "Status": "ready"
}

キーを指定して値を取り出す

.Address のようにオブジェクトのキーを指定すると、値を取り出すことができます。

echo $JSON | jq '.[].Address'
"192.168.0.1"
"192.168.0.2"
"192.168.0.3"

複数の値を取り出す

キーをカンマで区切ると、複数の値を取り出すことができます。今回の例のように配列の中に複数のオブジェクトがある場合は、フィルタで先に配列の中身を取り出しパイプで繋ぐことで、出力結果が配列の要素ごとにまとまります。foreach 文のようなイメージです。

echo $JSON | jq '.[] | .Address, .ID'
"192.168.0.1"
"1"
"192.168.0.2"
"2"
"192.168.0.3"
"3"

ダブルクォーテーションを消す

jq で取得した結果を他の処理にわたす際にダブルクォーテーションが邪魔になることがあります。-r(--raw-output)オプションで消すことができます。

echo $JSON | jq -r '.[] | .Address, .ID'
192.168.0.1
1
192.168.0.2
2
192.168.0.3
3

CSV 形式で出力する

結果をパイプでつなぎ @csvとすることで、CSV 形式で出力することができます。@csv に渡す値は配列にする必要があります。ダブルクォーテーションが自動で付与されるため、-rオプションが必要です。

echo $JSON | jq -r '.[] | [.Address, .ID] | @csv'
"192.168.0.1","1"
"192.168.0.2","2"
"192.168.0.3","3"

TSV 形式で出力する

結果をパイプでつなぎ @tsvとすることで、TSV 形式で出力することができます。

echo $JSON | jq -r '.[] | [.Address, .ID] | @tsv'
192.168.0.1	1
192.168.0.2	2
192.168.0.3	3

絞り込み検索をする

select()関数を使うことで値の絞り込み検索ができます。たとえば Address が 192.168.0.1 のオブジェクトだけを出力したい場合は以下のようにします。

echo $JSON | jq -r '.[] | select(.Address == "192.168.0.1") | [.Address, .ID] | @tsv'
192.168.0.1	1

and/or 検索

select()の中で and/or のキーワードで検索条件の追加ができます。

and 検索

echo $JSON | jq -r '.[] | select(.Version == "2.0.0" and .Status == "ready") | [.Address, .ID, .Version, .Status] | @tsv'
192.168.0.3	3	2.0.0	ready

or 検索

echo $JSON | jq -r '.[] | select(.Address == "192.168.0.1" or .Address =="192.168.0.2") | [.Address, .ID] | @tsv'
192.168.0.1	1
192.168.0.2	2

正規表現で検索

select()の中で test()を使うと正規表現で検索ができます。

echo $JSON | jq -r '.[] | select(.Name | test("^b")) | [.Address, .ID, .Name] | @tsv'
192.168.0.2	2	bar
192.168.0.3	3	buz

文字列の結合

文字型に + を利用することで文字列の結合ができます。出力を加工したいときなどに使います。

echo $JSON | jq -r '.[] | [.Address + "/32", .ID] | @tsv'
192.168.0.1/32  1
192.168.0.2/32  2
192.168.0.3/32  3

null 入力

jq は通常、json データを読み込んで使いますが、-n (--null-input) オプションで読み込むデータが無くても動かすことができます。jq の機能をサッと試したいときに使えるテクニックです。

jq -n 'now|localtime|todate'
"2022-01-09T23:40:34Z"

集計

max, min, sum, count など集計について別の記事にまとめました。

jqコマンド
jqコマンドで集計 group by, max, sum, count

jq コマンドで集計(最大、合計、数、平均、並び替え)をする方法を紹介します。jq のバージョンは 1.6。 以前書いた ...

続きを見る

日付のフォーマット変更とタイムゾーン変更

日付のフォーマット変更とタイムゾーン変更について別の記事にまとめました

jqコマンド
jqコマンドで日付のフォーマット変更とタイムゾーン変更

jq コマンドで日付を扱うときに、出力する日付のフォーマットを変更したり、タイムゾーンを UTC から JST に変更す ...

続きを見る

- 技術ブログ
- Linux

DockerHubのRate Limitの残数を確認する

WordPressのプラグインをwp-cliで更新する WordPress

深圳SEO优化公司天津网站优化按天收费报价合肥网络推广哪家好潜江英文网站建设公司汕尾网站改版报价保定英文网站建设哪家好白山seo优化报价固原网站关键词优化价格河源网站定制张北百度网站优化平顶山设计公司网站推荐聊城关键词排名包年推广哪家好滁州至尊标王报价武威seo网站优化报价盐城网页设计公司光明企业网站建设湘西如何制作网站价格铜陵网站推广价格襄阳百度seo推荐包头高端网站设计多少钱长治网站seo优化邵阳关键词按天扣费多少钱惠州网站改版济宁百度网站优化哪家好绵阳百度seo推荐揭阳百度seo哪家好茂名企业网站设计公司通化品牌网站设计公司沙井网站制作设计报价吉安百度爱采购推荐哈尔滨设计公司网站公司歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化