談到透過命令列處理 JSON ,直覺就會想到 jq

近來學會利用 jq 指令處理 JSON 資料後透過樣板(template)輸出格式化字串,因此本篇將分享 2 個關於 jq 的實用秘訣:

  • | 運算子(operator)
  • 輸出 jq 結果到 standard output (stdout)

本文環境

  • jq 1.4
  • macOS 10.15

| 運算子(operator)

jq 可以很快地取得 JSON 資料中的特定欄位值,例如:

$ echo '{"foo": {"bar": 1}}' | jq '.foo.bar'
1

但是 jq 其實還可以透過 | 運算子將資料丟進樣板中再輸出:

$ echo '{"foo": {"bar": 1}}' | jq '.foo.bar | tostring | "foo.bar=" + .'
"foo.bar=1"

上述範例我們透過 | 運算子將 bar 的值先轉成字串後,在丟到 "foo.bar=" + . 樣板中,將 foo.bar= 與 bar 的值透過 + 將 2 個字串結合在一起後輸出。

. 就是 bar 的值,如果你有多個欄位想一併輸出可以用 .欄位 的方式取得該欄位的值,例如:

$ echo '{"foo": {"a": "1", "b": "2"}}' | jq '.foo | "a=" + .a + " b=" + .b'
"a=1 b=2"

但是上述輸出的結果仍不盡理想,因為 jq 自動幫我們加上 " 包住輸出結果,如果我們想再運用其他指令處理 jq 的輸出結果就又得移除 "

然而解決方法其實很簡單,只要讓 jq 使用標準輸出即可。

輸出 jq 結果到 standard output (stdout)

要讓 jq 使用標準輸出(standard output, stdout) 其實很簡單,只要加上 -r 參數即可:

$ echo '{"foo": {"bar": 1}}' | jq -r '.foo.bar | tostring | "foo.bar=" + .'
foo.bar=1

-r 其實就代表 --raw-outputjq 就會將 " 去除。

With this option, if the filter’s result is a string then it will be written directly to standard output rather than being formatted as a JSON string with quotes. This can be useful for making jq filters talk to non-JSON-based systems.

以上就是本篇分享的 jq 超實用秘訣!

Happy Coding!

References

https://stedolan.github.io/jq/