如何在Linux中使用jq指令處理JSON

如何在Linux中使用jq指令處理JSON
顯示 JSON 檔案的監視器的照片。

Jq 是一個功能強大且高度靈活的解析器程序,可以從檔案和 UNIX 管道中串流和過濾 JSON 資料。本文將教您 jq 的基礎知識、演示程式碼範例以及您現在可以安裝的一些替代實作。

jq 有什麼用?

jq最常見的用途是處理和操作來自軟體即服務 (SaaS) API 的 JSON 回應。例如,您可以使用 jq 和 cURL 來存取 Digitalocean 的 API 端點以取得您的帳戶詳細資訊。

顯示 Digitalocean 到 jq 的範例 API 存取的終端。

除此之外,jq 也是管理大型 JSON 檔案的強大實用程式。當今一些最受歡迎的資料庫程式(例如 MongoDB、PostgreSQL 和 MySQL)都支援 JSON 作為儲存資料的方式。因此,學習 jq 可以讓您更好地理解這些資料庫系統的工作原理。

安裝和使用jq

要啟動 jq,請將其二進位套件安裝到您的系統中:

找一個可以測試 jq 的開放 API 端點。就我而言,我將使用 ipinfo.io 的 IP 檢查器 API。

使用Jq Json Linux 02 Ipinfo Saas網站

jq 最基本的過濾器是點 (.) 過濾器。當 jq 從標準輸入接收到 JSON 回應時,這將漂亮地列印 JSON 回應:

另一個基本過濾器是管道 (|) 符號。這是一種特殊的過濾器,它將一個過濾器的輸出作為另一個過濾器的輸入:

管道運算子後面的值是「物件標識符索引」。這會在您的 JSON 輸入中搜尋與其文字相符的任何變量,並在終端上列印其值。在本例中,我正在尋找“ip:”鍵的值。

顯示透過 jq 過濾的 ipinfo SaaS API 輸出的終端。

完成基礎知識後,以下部分將向您展示使用 jq 可以執行的一些技巧。

1. 使用 jq 建立基本 Feed 閱讀器

如今,大多數現代網站都提供開放 API 端點來讀取其平台內的資料。例如,每個 Github 儲存庫都有自己的 API URL,供您檢索專案的最新提交和問題。

顯示預設值的終端

您可以將這樣的 API 端點與 jq 結合使用來建立您自己的簡單「類似 RSS」的提要。首先,使用 cURL 測試端點是否正常運作:

執行以下命令列印提要中的第一個項目:

這將顯示 Github API 發送到 jq 的不同欄位。您可以使用這些透過將輸入傳遞到花括號 ( {}) 過濾器來建立您自己的自訂 JSON 物件:

在大括號內新增逗號 (,) 篩選器可讓您為自訂物件新增多個欄位:

顯示從 Github API 中剝離的自訂 JSON 物件的終端。

刪除方括號內的「0」會將 jq 過濾器套用至整個 feed:

您還可以建立一個小型 Bash 腳本來顯示您最喜歡的 Github 專案的最新問題。將以下程式碼區塊貼到空 shell 腳本檔案中:

儲存文件,然後執行以下命令使其可執行:

透過列出您最喜歡的 Github 儲存庫中的最新一期來測試您的新提要閱讀器:

顯示自訂腳本正在運行並列印最新的 Github 問題的終端。

2. 讀取和搜尋 JSON 資料庫

除了從 API 讀取資料之外,您還可以使用 jq 來管理本機電腦中的 JSON 檔案。首先使用您喜歡的文字編輯器建立一個簡單的 JSON 資料庫檔案:

將以下資料塊貼到檔案中,然後儲存:

透過列印資料庫數組中的第一個物件來測試 jq 是否正確讀取 JSON 檔案:

顯示 jq 的終端機列印 JSON 資料庫中的第一個條目。

使用「物件識別碼索引」篩選器對 JSON 資料庫進行查詢。就我而言,我正在資料庫中的每個條目上搜尋“.name”鍵的值:

您也可以使用 jq 的一些內建函數根據某些品質來過濾查詢。例如,您可以搜尋並列印所有“.name”值超過六個字元的 JSON 物件:

顯示具有名稱長度約束的 jq 輸出的終端。

使用 jq 操作 JSON 資料庫

除此之外,jq 還可以像基本電子表格一樣操作 JSON 資料庫。例如,以下命令列印資料庫中每個物件的“.balance”鍵的總和:

您甚至可以透過向查詢添加條件語句來擴展此功能。如果第二個物件的“.name”值為“Alice”,則以下內容只會加上“.balance”:

顯示在資料庫上執行的 jq 中的條件語句的終端。

可以暫時從 JSON 資料庫中刪除變數。如果您正在測試過濾器並且希望確保它仍然可以處理您的資料集,這可能會很有用:

顯示沒有名稱 JSON 金鑰的第二個條目的終端。

您也可以使用“+”運算符將新變數插入資料庫。例如,以下行將變數「active: true」新增至資料庫中的第一個物件:

終端機顯示第一個資料庫條目上的附加鍵值。

3. jq中轉換非JSON數據

jq 的另一個出色特性是它可以接受和處理非 JSON 資料。為了實現這一點,該程式使用另一種“slurp 模式”,將任何空格和換行符號分隔的資料轉換為 JSON 數組。

您可以透過使用標誌將資料傳輸到 jq 來啟用此功能-s

顯示轉換為 JSON 陣列的文字字串的終端。

將原始資料轉換為陣列的優點之一是您可以使用陣列索引號碼來尋址它們。以下命令透過引用兩個值轉換後的陣列位置來新增兩個值:

您可以進一步取得此數組位置並圍繞它建構新的 JSON 程式碼。例如,此程式碼透過花括號過濾器將 echo 命令中的文字轉換為 JSON 物件:

顯示範例資料庫格式的自訂 JSON 物件的終端。

除了取得原始資料之外,jq 還可以傳回非 JSON 資料作為其輸出。如果您使用 jq 作為較大 shell 腳本的一部分並且只需要其篩選器的結果,這非常有用。

為此,請運行 jq,然後運行該-r標誌。例如,以下命令從我的資料庫檔案中讀取所有名稱並將其作為純文字資料傳回:

顯示資料庫中的姓名清單(格式已被刪除)的終端。

jq 的替代 JSON 解析器

由於 jq 的程式碼是開源的,因此各個開發人員創建了自己的 JSON 解析器版本。其中每一個都有自己獨特的賣點,可以改進或改變 jq 的核心部分。

1. 喜歡

Jaq是一個強大的 JSON 解析器,提供與 jq 幾乎相同的功能集。

Jaq 是用 Rust 編寫的,最大的賣點之一是它運行 jq 語言的速度比原始解析器快 30 倍,同時仍保留向後相容性。當您運行大型 jq 過濾器並且希望最大限度地提高機器性能時,僅此一點就很有價值。

顯示 jaq 在我的範例資料庫上運行的終端。

也就是說,jaq 的一個缺點是它目前在 Debian、Ubuntu 和 Fedora 儲存庫上不可用。獲取它的唯一方法是下載 Homebrew 或從原始程式碼編譯它。

2. 去

Gojq是另一種完全用 Go 寫的 JSON 解析器。它提供了易於訪問且易於使用的 jq 版本,您可以將其安裝在幾乎任何平台上。

原始 jq 程式的錯誤訊息非常簡潔。因此,調試 jq 腳本對於 jq 新用戶來說尤其困難。 Gojq 透過向您顯示腳本中的錯誤所在以及提供有關所發生錯誤類型的詳細訊息來解決此問題。

顯示為 gojq 讀取的範例資料庫的終端機。

gojq 的另一個賣點是它可以讀取和處理 JSON 和 YAML 檔案。如果您是 Docker 和 Docker Compose 使用者並且想要自動化部署工作流程,這會特別有用。

Gojq 最大的問題是它刪除了原始 jq 解析器預設提供的一些功能。例如,gojq 上不存在--ascii-output--seq、 和等選項。--sort-keys

3.問

與 jaq 和 gojq 不同,fq是一個綜合軟體工具包,可以解析文字和二進位資料。它可以使用各種流行的格式,例如 JSON、YAML、HTML,甚至 FLAC。

顯示 fq 讀取範例資料庫檔案的終端。

fq 最大的特點是它包含一個內建的檔案十六進位閱讀器。這使得查看文件的內部結構以確定它的製作方式以及是否有任何問題變得簡單。除此之外,fq 在處理文字時也使用與 jq 相同的語法,這使得任何已經熟悉 jq 的人都可以輕鬆學習。

這項雄心勃勃的目標的一個缺點是《fq》仍處於大力開發階段。因此,該程式的某些功能和行為仍然會發生徹底的變化。

探索 jq、它的工作原理以及它的特別之處只是學習如何在電腦上編寫程式的第一步。透過閱讀 shell 程式設計的基礎知識,深入了解奇妙的程式設計世界。

圖片來源:Ferenc Almasi,來自 Unsplash。所有修改和螢幕截圖均由 Ramces Red 進行。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *