Help us understand the problem. What is going on with this article?

[ jq ] keyの値にドット(.)が入っているときはどうするか

More than 3 years have passed since last update.

jqコマンドは便利です。もっと使いこなしたい。

0. 普通の使い方

こういうファイルがあったとする

testfile
{
  "result": {
    "hostname": {
      "testserverlocal": {
        "status": "fail"
      }
    }
  }
}

このようにjqコマンドを使うとstatusの値を取り出せる

cat testfile | jq .result.hostname.testserverlocal.status
=> "fail"

##あるいはrオプションでダブルクォーテーション消す
cat testfile | jq -r .result.hostname.testserverlocal.status
=> fail

1. keyにドット(.)があるときはどうする?

testfile02
{
  "result": {
    "hostname": {
      "test.server.local": {
        "status": "fail"
      }
    }
  }
}

この場合はcat testfile2 | jq .result.hostname.test.server.local.statusだとうまくいかない。マニュアルを読んでみた。このマニュアル(https://stedolan.github.io/jq/manual/ ) の中にこういう記述がある。

The .foo syntax only works for simply keys i.e. keys that are all alphanumeric characters. 
.[<string>] works with keys that contain special characters such as colons and dots. 
For example .["foo::bar"] and .["foo.bar"] work while .foo::bar and .foo.bar would not.

これによればcat testfile2 | jq .result.hostname.["test.server.local"].statusとすれば良いのかな?と思うが、やってみると失敗した。。。。その後ググったり試行錯誤をしてみた。結局下記のようにするとうまくいきました。他のやり方あればぜひ教えていただきたいです。。。(と書いたら情報をいただき大変感謝です)。

cat testfile2 | jq .result.hostname | jq '.["test.server.local"]'.status
=> "fail"

  • .["foo.bar"]ではなく'.["foo.bar"]'とする(シングルクォートで囲む)
  • ネストされているキーに対してこの手法は使えないのでjqをパイプでつないでみた。

2. 追記(いろいろな方法)

jq .result.hostname'["test.server.local"]'.statusと書く。
またはクエリ全体をシングルクォートで囲んでjq '.result.hostname["test.server.local"].status'と書く。
要するにhostnameというキーの要素を指定するときにドット(.)でつなげないで直接つなげる。
下記2種類のクエリ指定でどちらも同じ結果が返った。

cat testfile2 | jq '.result.hostname["test.server.local"].status'
=> "fail"

cat testfile2 | jq .result.hostname'["test.server.local"]'.status
=> "fail"


penguin_dream
フロントエンド(主にjavascript)、プログラミング、インフラ構築、インフラ運用、CIなどのメモ。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした