jqコマンドは便利です。もっと使いこなしたい。
0. 普通の使い方
こういうファイルがあったとする
{
"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にドット(.)があるときはどうする?
{
"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"