如何用jq解析linux命令列上的json檔案

JSON是在web上傳輸基於文字的資料的最流行格式之一。到處都是,你一定會遇到的。我們將向您展示如何使用jq命令從Linux命令列處理它。...

JSON是在web上傳輸基於文字的資料的最流行格式之一。到處都是,你一定會遇到的。我們將向您展示如何使用jq命令從Linux命令列處理它。

json和jq

JSON代表JavaScript物件表示法。這是一種允許資料以自我描述的方式編碼成純文字檔案的方案。JSON檔案中沒有註釋,內容應該是不言自明的。每個資料值都有一個名為“name”或“key”的文字字串,它告訴您資料值是什麼。他們一起被稱為名稱:值對,或鍵:值對。冒號(:)將鍵與其值分開。

“物件”是鍵:值對。在JSON檔案中,物件以大括號({)開始,以大括號(})結束。JSON還支援“陣列”,即值的有序列表。陣列以左括號([)開始,以右括號(])結束。

當然,從這些簡單的定義中,可以產生任意的複雜性。例如,物件可以巢狀在物件中。物件可以包含陣列,陣列也可以包含物件。所有這些都可以有開放的巢狀級別。

但實際上,如果JSON資料的佈局錯綜複雜,那麼資料佈局的設計可能需要重新考慮。當然,如果您沒有生成JSON資料,只是嘗試使用它,那麼您在它的佈局中就沒有發言權。不幸的是,在這種情況下,你只需要處理它。

大多數程式語言都有允許它們解析JSON資料的庫或模組。遺憾的是,bashshell沒有這樣的功能。

需要是發明之母,然而,jq實用程式誕生了!使用jq,我們可以輕鬆地在bashshell中解析JSON。不管你是必須使用精心設計、優雅的JSON,還是噩夢中的那些東西。

如何安裝jq

我們必須在研究本文時使用的所有Linux發行版上安裝jq。

要在Ubuntu上安裝jq,請鍵入以下命令:

sudo apt-get install jq

如何用jq解析linux命令列上的json檔案

要在Fedora上安裝jq,請鍵入以下命令:

sudo dnf install jq

如何用jq解析linux命令列上的json檔案

要在Manjaro上安裝jq,請鍵入以下命令:

sudo pacman -Sy jq

如何用jq解析linux命令列上的json檔案

如何使json可讀

JSON不關心空格,佈局也不影響它。只要遵循JSON語法規則,處理JSON的系統就可以讀取和理解它。正因為如此,JSON通常作為一個簡單的長字串進行傳輸,而不考慮佈局。這節省了一些空間,因為JSON中不必包含製表符、空格和新行字元。當然,這一切的缺點是當人類試圖閱讀它時。

讓我們從NASA的網站上提取一個短的JSON物件,它告訴我們國際空間站的位置。我們將使用curl,它可以下載檔案來檢索JSON物件。

我們不關心curl通常生成的任何狀態訊息,因此我們將使用-s(silent)選項鍵入以下內容:

curl -s http://api.open-notify.org/iss-now.json

如何用jq解析linux命令列上的json檔案

現在,稍加努力,你就能讀到這個。您必須選擇資料值,但這既不容易也不方便。讓我們重複一遍,但這次我們將透過jq來實現。

jq使用過濾器來解析JSON,其中最簡單的是句點(.),這意味著“列印整個物件”。預設情況下,jq將列印輸出。

我們將所有內容放在一起,並鍵入以下內容:

curl -s http://api.open-notify.org/iss-now.json | jq .

如何用jq解析linux命令列上的json檔案

好多了!現在,我們可以看到到底發生了什麼。

整個物件用大括號括起來。它包含兩個鍵:名稱對:訊息和時間戳。它還包含一個名為iss\u position的物件,其中包含兩個鍵:值對:經度和緯度。

我們再試一次。這次我們將鍵入以下內容,並將輸出重定向到名為iss.json檔案”:

curl -s http://api.open-notify.org/iss-now.json | jq . > iss.json cat iss.json

如何用jq解析linux命令列上的json檔案

這為我們在硬碟上提供了一個佈局良好的JSON物件副本。

相關:如何使用curl從Linux命令列下載檔案

訪問資料值

正如我們在上面看到的,jq可以從JSON提取透過管道傳輸的資料值。它還可以處理儲存在檔案中的JSON。我們將使用本地檔案,這樣命令列就不會被curl命令弄得亂七八糟。這樣應該會更容易理解。

從JSON檔案中提取資料的最簡單方法是提供一個鍵名來獲取其資料值。鍵入句點和關鍵字名稱,兩者之間不留空格。這將根據關鍵字名稱建立一個篩選器。我們還需要告訴jq要使用哪個JSON檔案。

我們鍵入以下內容以檢索訊息值:

jq .message iss.json

如何用jq解析linux命令列上的json檔案

jq在終端視窗中列印訊息值的文字。

如果鍵名包含空格或標點符號,則必須用引號將其篩選器括起來。通常注意使用字元、數字和下劃線,這樣JSON鍵名就不會有問題。

首先,我們鍵入以下內容來檢索時間戳值:

jq .timestamp iss.json

如何用jq解析linux命令列上的json檔案

在終端視窗中檢索並列印時間戳值。

但是我們怎樣才能訪問iss\u position物件中的值呢?我們可以使用JSON點表示法。我們將在鍵值的“路徑”中包含iss\u位置物件名。為此,鍵所在的物件的名稱將位於鍵本身的名稱之前。

我們鍵入以下內容,包括緯度鍵名稱(注意“.iss_uposition”和“.latitude”之間沒有空格):

jq .iss_position.latitude iss.json

如何用jq解析linux命令列上的json檔案

要提取多個值,必須執行以下操作:

  • 在命令列中列出關鍵字名稱。
  • 用逗號(,)分隔。
  • 用引號(“)或撇號(')括起來。

有鑑於此,我們鍵入以下內容:

jq ".iss_position.latitude, .timestamp" iss.json

如何用jq解析linux命令列上的json檔案

這兩個值列印到終端視窗。

使用陣列

讓我們從NASA獲取一個不同的JSON物件。

這一次,我們將使用目前在太空的宇航員名單:

curl -s http://api.open-notify.org/astros.json

如何用jq解析linux命令列上的json檔案

好吧,那成功了,我們再來一次。

我們將鍵入以下命令,透過管道將其傳遞到jq,並將其重定向到名為astro.json檔案”:

curl -s http://api.open-notify.org/astros.json | jq . > astro.json

如何用jq解析linux命令列上的json檔案

現在,讓我們鍵入以下內容來檢查檔案:

less astro.json

如何用jq解析linux命令列上的json檔案

如下圖所示,我們現在看到了太空中宇航員的名單,以及他們的航天器。

如何用jq解析linux命令列上的json檔案

這個JSON物件包含一個名為people的陣列。我們知道這是一個數組,因為開頭的括號([)(在上面的螢幕截圖中突出顯示)。它是一個物件陣列,每個物件包含兩個鍵:值對:名稱和工藝。

和前面一樣,我們可以使用JSON點符號來訪問這些值。我們還必須在陣列的名稱中包含括號([])。

考慮到所有這些,我們鍵入以下內容:

jq ".people[].name" astro.json

如何用jq解析linux命令列上的json檔案

這一次,所有名稱值都列印到終端視窗。我們要求jq為陣列中的每個物件列印名稱值。很整潔,是吧?

如果將單個物件在陣列中的位置放在命令列的方括號([])中,則可以檢索該物件的名稱。陣列使用零偏移索引,這意味著陣列第一個位置的物件為零。

要訪問陣列中的最後一個物件,可以使用-1;要獲取陣列中倒數第二個物件,可以使用-2,依此類推。

有時,JSON物件提供陣列中的元素數,這就是這個陣列的情況。它與陣列一起包含鍵:名稱對呼叫值為6的數字。

此陣列中的物件數如下:

jq ".people[1].name" astro.json jq ".people[3].name" astro.json jq ".people[-1].name" astro.json jq ".people[-2].name" astro.json

如何用jq解析linux命令列上的json檔案

也可以在陣列中提供開始和結束物件。這就是所謂的“切片”,它可能有點混亂。記住陣列使用零偏移量。

要從索引位置2到(但不包括)索引位置4的物件檢索物件,請鍵入以下命令:

jq ".people[2:4]" astro.json

如何用jq解析linux命令列上的json檔案

這將列印陣列索引2(陣列中的第三個物件)和3(陣列中的第四個物件)處的物件。它在陣列索引4處停止處理,這是陣列中的第五個物件。

更好地理解這一點的方法是在命令列上進行實驗。你很快就會明白它的工作原理。

如何使用帶過濾器的管道

您可以將輸出從一個過濾器傳輸到另一個過濾器,而不必學習新符號。與Linux命令列相同,jq使用垂直條(|)表示管道。

我們將告訴jq將人員陣列匯入.name過濾器,該過濾器應在終端視窗中列出宇航員的姓名。

我們鍵入以下內容:

jq ".people[] | .name" astro.json

如何用jq解析linux命令列上的json檔案

相關:如何在Linux上使用管道

建立陣列和修改結果

我們可以使用jq來建立新的物件,比如陣列。在本例中,我們將提取三個值並建立一個包含這些值的新陣列。注意,左括號([)和右括號(])也是篩選器字串中的第一個和最後一個字元。

我們鍵入以下內容:

jq "[.iss-position.latitude, iss_position.longitude, .timestamp]" iss.json

如何用jq解析linux命令列上的json檔案

輸出用括號括起來並用逗號分隔,使其成為一個格式正確的陣列。

數值也可以在檢索時進行操作。讓我們從ISS位置檔案中提取時間戳,然後再次提取它並更改返回的值。

為此,我們鍵入以下內容:

jq ".timestamp" iss.json jq ".timestamp - 1570000000" iss.json

如何用jq解析linux命令列上的json檔案

如果需要從值陣列中新增或刪除標準偏移量,這將非常有用。

讓我們輸入以下內容來提醒自己iss.json檔案檔案包含:

jq . iss.json

如何用jq解析linux命令列上的json檔案

假設我們想刪除這個訊息鍵:值對。這與國際空間站的位置無關。它只是一個標誌,表明位置檢索成功。如果超出了要求,我們就可以省去它。(你也可以忽略它。)

我們可以使用jq的delete函式del()來刪除鍵:值對。刪除郵件鍵:值對,我們鍵入以下命令:

jq "del(.message)" iss.json

如何用jq解析linux命令列上的json檔案

注意,這實際上並沒有從iss.json檔案檔案;它只是將其從命令的輸出中刪除。如果您需要建立一個沒有訊息的新檔案鍵:值對在其中,執行命令,然後將輸出重定向到新檔案中。

更復雜的json物件

讓我們再檢索一些NASA的資料。這次,我們將使用一個JSON物件,該物件包含來自世界各地流星撞擊站點的資訊。這是一個比我們以前處理過的更復雜的JSON結構的更大的檔案。

首先,我們將鍵入以下命令將其重定向到名為**.json”:

curl -s https://data.nasa.gov/resource/y77d-th95.json | jq . > strikes.json

如何用jq解析linux命令列上的json檔案

要檢視JSON的外觀,請鍵入以下內容:

less strikes.json

如何用jq解析linux命令列上的json檔案

如下所示,檔案以一個左括號([)開始,因此整個物件是一個數組。陣列中的物件是鍵:值對,還有一個巢狀物件叫做geolocation。地理位置物件包含更多鍵:值對,以及一個稱為座標的陣列。

如何用jq解析linux命令列上的json檔案

讓我們從索引位置995到陣列末尾的物件中檢索流星撞擊的名稱。

我們將鍵入以下內容以透過三個過濾器傳遞JSON:

jq ".[995:] | .[] | .name" strikes.json

如何用jq解析linux命令列上的json檔案

過濾器的工作方式如下:

  • [995:]:這告訴jq處理從陣列索引995到陣列末尾的物件。冒號(:)後面沒有數字告訴jq繼續到陣列的末尾。
  • []:這個陣列迭代器告訴jq處理陣列中的每個物件。
  • .name:此篩選器提取名稱值。

只要稍作改動,我們就可以從陣列中提取最後10個物件。“-10”指示jq從陣列的末尾開始處理物件10。

我們鍵入以下內容:

jq ".[-10:] | .[] | .name" strikes.json

如何用jq解析linux命令列上的json檔案

正如我們在前面的示例中所做的,我們可以鍵入以下內容來選擇單個物件:

jq ".[650].name" strikes.json

如何用jq解析linux命令列上的json檔案

我們也可以對字串應用切片。為此,我們將鍵入以下內容以請求陣列索引234處物件名稱的前四個字元:

jq ".[234].name[0:4]" strikes.json

如何用jq解析linux命令列上的json檔案

我們也可以看到一個特定的物體的整體。為此,我們鍵入以下內容幷包含一個不帶任何關鍵字:值過濾器:

jq ".[234]" strikes.json

如何用jq解析linux命令列上的json檔案

如果只想檢視值,則可以在不使用鍵名的情況下執行相同的操作。

在我們的示例中,我們鍵入以下命令:

jq ".[234][]" strikes.json

如何用jq解析linux命令列上的json檔案

要從每個物件檢索多個值,我們在下面的命令中用逗號分隔它們:

jq ".[450:455] | .[] | .name, .mass" strikes.json

如何用jq解析linux命令列上的json檔案

如果要檢索巢狀值,則必須標識構成這些值的“路徑”的物件。

例如,要引用座標值,我們必須包括全包陣列、地理位置巢狀物件和巢狀座標陣列,如下所示。

如何用jq解析linux命令列上的json檔案

要檢視陣列索引位置121處物件的座標值,請鍵入以下命令:

jq ".[121].geolocation.coordinates[]" strikes.json

如何用jq解析linux命令列上的json檔案

長度函式

jq length函式根據應用的內容提供不同的度量,例如:

  • 字串:以位元組為單位的字串長度。
  • 物件:數量鍵:值對在物件中。
  • 陣列:陣列中陣列元素的數目。

以下命令返回JSON陣列中10個物件的名稱值的長度,從索引位置100開始:

jq ".[100:110] | .[].name | length" strikes.json

如何用jq解析linux命令列上的json檔案

看看有多少鍵:值對在陣列的第一個物件中,鍵入以下命令:

jq ".[0] | length" strikes.json

如何用jq解析linux命令列上的json檔案

按鍵起作用

您可以使用keys函式來了解您必須使用的JSON。它可以告訴您鍵的名稱,以及陣列中有多少個物件。

在“中的people物件中查詢鍵”astro.json檔案“檔案,我們鍵入以下命令:

jq ".people.[0] | keys" astro.json

如何用jq解析linux命令列上的json檔案

要檢視人員陣列中有多少元素,請鍵入以下命令:

jq ".people | keys" astro.json

如何用jq解析linux命令列上的json檔案

這表明有六個零偏移量的陣列元素,編號為0到5。

has()函式

您可以使用has()函式查詢JSON並檢視物件是否具有特定的鍵名。注意,金鑰名稱必須用引號括起來。我們將filter命令用單引號(')括起來,如下所示:

jq '.[] | has("nametype")' strikes.json

如何用jq解析linux命令列上的json檔案

將檢查陣列中的每個物件,如下所示。

如何用jq解析linux命令列上的json檔案

如果要檢查特定物件,請在陣列篩選器中包括其索引位置,如下所示:

jq '.[678] | has("nametype")' strikes.json

如何用jq解析linux命令列上的json檔案

沒有它不要靠近json

jq實用程式是專業的、強大的、快速的軟體的完美例子,它使生活在Linux世界變得如此愉快。

這只是對這個命令的常見功能的簡單介紹,還有很多。如果你想更深入的挖掘,一定要檢視全面的jq手冊。

  • 發表於 2021-04-14 19:24
  • 閱讀 ( 56 )
  • 分類:網際網路

你可能感興趣的文章

json-python解析:簡單指南

... 有一些庫和工具箱可用於從幾乎任何語言和環境中解析和生成JSON。本文主要討論使用python處理JSON時產生的方法和問題。 ...

  • 發佈於 2021-03-13 11:20
  • 閲讀 ( 47 )

如何用dd輕鬆克隆和恢復linux磁碟映像

當需要在Linux上擦除、備份或恢復資料時,可以選擇許多應用程式。GParted是最有效的選擇之一。磁碟是一個更現代的替代品,在GNOME桌面環境中看起來很不錯。但無論您執行哪種Linux作業系統,都有一個選項始終有效——dd。 ...

  • 發佈於 2021-03-15 00:51
  • 閲讀 ( 55 )

如何用ssh遠端管理linux伺服器

伺服器管理仍然是一項必要的任務,有時也很麻煩。使用遠端伺服器或無頭伺服器尤其困難。謝天謝地,有了安全Shell(SSH)。secureshell是一種網路協議,允許網路服務在不安全的網路上執行。 ...

  • 發佈於 2021-03-15 17:05
  • 閲讀 ( 53 )

如何用python讀寫google工作表

Python是一種優秀的程式語言。語法可能看起來奇怪和不尋常,但它很容易學習和使用。它支援Minecraft Pi版,以及一系列網站和學術研究專案。 ...

  • 發佈於 2021-03-16 13:43
  • 閲讀 ( 71 )

如何用樹莓皮打造diy谷歌家庭助理

語音控制助理很快就變得司空見慣了。許多家庭都有一個Alexa或googlehome來控制從燈光到媒體的一切,甚至計時。 ...

  • 發佈於 2021-03-22 22:23
  • 閲讀 ( 49 )

如何在linux上管理ip地址:查詢、設定和更改

...果要從終端ping localhost,由於hosts檔案中的第一行,它將解析為127.0.0.1。這就是我們需要用新主機名更新它以確保正確解析的原因。 ...

  • 發佈於 2021-03-24 17:34
  • 閲讀 ( 55 )

轉換json並使用jq使其可讀

... 另請參見:JSON Python解析:簡單指南 ...

  • 發佈於 2021-03-27 02:07
  • 閲讀 ( 43 )

如何用cp命令在linux中複製檔案

如果您使用cp命令,那麼在Linux中複製檔案和目錄可以快速而輕鬆。我們將學習如何使用cp,並利用其方便的選擇,將使您的影印工作更安全。 ...

  • 發佈於 2021-03-28 11:33
  • 閲讀 ( 41 )

如何用python3構建基本電報機器人

如果你是一個電報使用者,你一定會在某個時候與聊天機器人進行“對話”。Telegram的機器人有著驚人的可定製性,它提供了各種各樣的優勢——無論是自動完成任務,還是在聊天室裡玩遊戲。 ...

  • 發佈於 2021-03-28 15:23
  • 閲讀 ( 55 )

如何在windows命令列上轉義檔案路徑中的空格

命令列環境(如Windows命令提示符和PowerShell)使用空格分隔命令和引數,但檔名和資料夾名也可以包含空格。要指定一個檔案路徑,其中有一個空格,您需要“轉義”它。 命令列101:為什麼要逃出空格 “轉義”字元會改變其...

  • 發佈於 2021-04-01 11:39
  • 閲讀 ( 48 )
biubuipiupa
biubuipiupa

0 篇文章

作家榜

  1. admin 0 文章
  2. 孫小欽 0 文章
  3. JVhby0 0 文章
  4. fvpvzrr 0 文章
  5. 0sus8kksc 0 文章
  6. zsfn1903 0 文章
  7. w91395898 0 文章
  8. SuperQueen123 0 文章

相關推薦