jq 指令超實用秘訣

Posted on  May 21, 2020  in  Unix-like 命令列教學  by  Amo Chen  ‐ 2 min read

談到透過命令列處理 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/

對抗久坐職業傷害

研究指出每天增加 2 小時坐著的時間,會增加大腸癌、心臟疾病、肺癌的風險,也造成肩頸、腰背疼痛等常見問題。

然而對抗這些問題,卻只需要工作時定期休息跟伸展身體即可!

你想輕鬆改變現狀嗎?試試看我們的 PomodoRoll 番茄鐘吧! PomodoRoll 番茄鐘會根據你所設定的專注時間,定期建議你 1 項辦公族適用的伸展運動,幫助你打敗久坐所帶來的傷害!

贊助我們的創作

看完這篇文章了嗎? 休息一下,喝杯咖啡吧!

如果你覺得 MyApollo 有讓你獲得實用的資訊,希望能看到更多的技術分享,邀請你贊助我們一杯咖啡,讓我們有更多的動力與精力繼續提供高品質的文章,感謝你的支持!