jq輸出文本_如何用 Linux 命令行工具解析和格式化輸出 JSON | Linux 中國

17d42d4559332c25080fb240c56d653c.png我們將使用 Linux 上的命令行工具解析并格式化打印 JSON。它對于在 shell 腳本中處理大型 JSON 數據或在 shell 腳本中處理 JSON 數據非常有用。-- Ostechnix

JSON 是一種輕量級且與語言無關的數據存儲格式,易于與大多數編程語言集成,也易于人類理解 —— 當然,如果格式正確的話。JSON 這個詞代表?Java?Script?Object?Notation,雖然它以 JavaScript 開頭,而且主要用于在服務器和瀏覽器之間交換數據,但現在正在用于許多領域,包括嵌入式系統。在這里,我們將使用 Linux 上的命令行工具解析并格式化打印 JSON。它對于在 shell 腳本中處理大型 JSON 數據或在 shell 腳本中處理 JSON 數據非常有用。

什么是格式化輸出?

JSON 數據的結構更具人性化。但是在大多數情況下,JSON 數據會存儲在一行中,甚至沒有行結束字符。

顯然,這對于手動閱讀和編輯不太方便。

這是格式化輸出pretty print就很有用。這個該名稱不言自明:重新格式化 JSON 文本,使人們讀起來更清晰。這被稱為?JSON 格式化輸出。

用 Linux 命令行工具解析和格式化輸出 JSON

可以使用命令行文本處理器解析 JSON 數據,例如?awksed?和?gerp。實際上?JSON.awk?是一個來做這個的 awk 腳本。但是,也有一些專用工具可用于同一目的。

1.?jq?或?jshon,shell 下的 JSON 解析器,它們都非常有用。2.?Shell 腳本,如?JSON.sh?或?jsonv.sh,用于在 bash、zsh 或 dash shell 中解析JSON。3.?JSON.awk,JSON 解析器 awk 腳本。4.?像?json.tool?這樣的 Python 模塊。5.?undercore-cli,基于 Node.js 和 javascript。

在本教程中,我只關注?jq,這是一個 shell 下的非常強大的 JSON 解析器,具有高級過濾和腳本編程功能。

JSON 格式化輸出

JSON 數據可能放在一行上使人難以解讀,因此為了使其具有一定的可讀性,JSON 格式化輸出就可用于此目的的。

示例:來自?jsonip.com?的數據,使用?curl?或?wget?工具獲得 JSON 格式的外部 IP 地址,如下所示。

$ wget -cq http://jsonip.com/ -O -

實際數據看起來類似這樣:

{"ip":"111.222.333.444","about":"/about","Pro!":"http://getjsonip.com"}

現在使用?jq?格式化輸出它:

$ wget -cq http://jsonip.com/ -O - | jq '.'

通過?jq?過濾了該結果之后,它應該看起來類似這樣:

{ "ip": "111.222.333.444", "about": "/about", "Pro!": "http://getjsonip.com"}

同樣也可以通過 Python?json.tool?模塊做到。示例如下:

$ cat anything.json | python -m json.tool

這種基于 Python 的解決方案對于大多數用戶來說應該沒問題,但是如果沒有預安裝或無法安裝 Python 則不行,比如在嵌入式系統上。

然而,json.tool?Python 模塊具有明顯的優勢,它是跨平臺的。因此,你可以在 Windows、Linux 或 Mac OS 上無縫使用它。

如何用 jq 解析 JSON

首先,你需要安裝?jq,它已被大多數 GNU/Linux 發行版選中,并使用各自的軟件包安裝程序命令進行安裝。

在 Arch Linux 上:

$ sudo pacman -S jq

在 Debian、Ubuntu、Linux Mint 上:

$ sudo apt-get install jq

在 Fedora 上:

$ sudo dnf install jq

在 openSUSE 上:

$ sudo zypper install jq

對于其它操作系統或平臺參見官方的安裝指導。

jq 的基本過濾和標識符功能

jq?可以從?STDIN?或文件中讀取 JSON 數據。你可以根據情況使用。

單個符號?.?是最基本的過濾器。這些過濾器也稱為對象標識符-索引。jq?使用單個?.?過濾器基本上相當將輸入的 JSON 文件格式化輸出。

??單引號:不必始終使用單引號。但是如果你在一行中組合幾個過濾器,那么你必須使用它們。??雙引號:你必須用兩個雙引號括起任何特殊字符,如?@$,例如?jq .foo.”@bar”。??原始數據打印:不管出于任何原因,如果你只需要最終解析的數據(不包含在雙引號內),請使用帶有?-r?標志的?jq?命令,如下所示:jq -r .foo.bar

解析特定數據

要過濾出 JSON 的特定部分,你需要了解格式化輸出的 JSON 文件的數據層次結構。

來自維基百科的 JSON 數據示例:

{ "firstName": "John", "lastName": "Smith", "age": 25, "address": { "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021"}, "phoneNumber": [{ "type": "home", "number": "212 555-1234"},{ "type": "fax", "number": "646 555-4567"}], "gender": { "type": "male" }}

我將在本教程中將此 JSON 數據用作示例,將其保存為?sample.json

假設我想從?sample.json?文件中過濾出地址。所以命令應該是這樣的:

$ jq .address sample.json

示例輸出:

{ "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021"}

再次,我想要郵政編碼,然后我要添加另一個對象標識符-索引,即另一個過濾器。

$ cat sample.json | jq .address.postalCode

另請注意,過濾器區分大小寫,并且你必須使用完全相同的字符串來獲取有意義的輸出,否則就是 null。

從 JSON 數組中解析元素

JSON 數組的元素包含在方括號內,這無疑是非常通用的。

要解析數組中的元素,你必須使用?[]?標識符以及其他對象標識符索引。

在此示例 JSON 數據中,電話號碼存儲在數組中,要從此數組中獲取所有內容,你只需使用括號,像這個示例:

$ jq .phoneNumber[] sample.json

假設你只想要數組的第一個元素,然后使用從?0?開始的數組對象編號,對于第一個項目,使用?[0],對于下一個項目,它應該每步增加 1。

$ jq .phoneNumber[0] sample.json

腳本編程示例

假設我只想要家庭電話,而不是整個 JSON 數組數據。這就是用?jq?命令腳本編寫的方便之處。

$ cat sample.json | jq -r '.phoneNumber[] | select(.type == "home") | .number'

首先,我將一個過濾器的結果傳遞給另一個,然后使用?select?屬性選擇特定類型的數據,再次將結果傳遞給另一個過濾器。

解釋每種類型的?jq?過濾器和腳本編程超出了本教程的范圍和目的。強烈建議你閱讀?jq?手冊,以便更好地理解下面的內容。

資源:

??https://stedolan.github.io/jq/manual/??http://www.compciv.org/recipes/cli/jq-for-parsing-json/??https://lzone.de/cheat-sheet/jq

via:?https://www.ostechnix.com/how-to-parse-and-pretty-print-json-with-linux-commandline-tools/

作者:ostechnix?選題:lujun9972?譯者:wxy?校對:wxy

本文由?LCTT?原創編譯,Linux中國?榮譽推出

2a5033b3c7829fb52a5bf77769a30e89.png?:還在看嗎?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533267.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533267.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533267.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機組成原理單周期mips,計算機組成原理CPU單周期數據通路(MIPS)

計算機組成原理CPU單周期數據通路(MIPS)【計算機組成原理】CPU:單周期數據通路(MIPS)寄存器傳送語言RTL1)R(r)表示寄存器r的內容2)M(address)表示主存儲器地址address的內容3)傳輸方向“←”表示,從右向左傳輸4)程序計數器PC的內容直接用PC表示輸出信號改變時機1)se…

gmp計算機系統課件,EU GMP附錄11計算機系統◆問答

GMP關于計算機系統的法規Zhulikou431整理,丁香園首發EU GMP guide annexes - Supplementary requirements: Annex 11Computerised Systems1. Appropriate controls for electronic documents such as templates should be implemented. Are there any specific requ…

不規則圖形數格子的方法_【微課堂】人教版五年級數學(上)6.5不規則圖形的面積圖文精講+教學視頻+同步練習...

小學生精選資料庫,家有小學生都在關注更多資料、微課堂,請至文末人教教材同步微課堂(包括視頻微課、教材同步、圖文講解、同步練習等),可以在課堂之外幫助同學們學習。歡迎轉發給更多的同學哦~~電子課本點擊圖片,查看大圖▼▼▼▼…

計算機安全評估研究綜合,計算機網絡信息系統安全評價方法研究

摘要:該文論述了計算機網絡安全現狀,評價現狀,以及網絡信息安全評估標準,包括美國可信計算機安全評價標準(TCSEC),歐洲的安全評價標準(ITSEC),國際通用準則(CC,等同GB18336),我國計算機信息系統安全保護等級劃分準則(GB17859-1999).綜述了現在常用的幾種評價方法,包…

動態獲取某個元素的高度_codeforces 1443D,解法簡單,思維縝密的動態規劃問題...

大家好,歡迎來到codeforces專題。今天選擇的問題是1443場次的D題,這題是全場倒數第三題,截止到現在一共通過了2800余人。這題的思路不算難,但是思考過程非常有趣,這也是這一期選擇它的原因。鏈接:https://c…

顯卡的優化以提高計算機性能作用,顯卡優化,教您如何設置NVIDIA(英偉達)顯卡玩游戲性能更高...

多人玩游戲可能都只是在游戲中設置畫質選項,比如反鋸齒等;而對顯卡驅動控制面板中的設置并不關注。其實在顯卡驅動面板中設置游戲文件,可以更好的控制和提高游戲畫質、性能。那如何設置NVIDIA顯卡玩游戲性能更高?下面,…

服務器選購seo優化規則,如何選擇有利于SEO優化的空間服務器

之前我們講過域名,講過程序,今天我們來講解空間,其實空間主要影響SEO只有兩個方面,一個是速度,一個是穩定性,如果你的空間穩定性不夠,經常打不開,百度蜘蛛經常抓取不了,就…

安裝npm_Npm安裝包的版本號是如何更新的?

點擊右上方紅色按鈕關注“小鄭搞碼事”,每天都能學到知識,搞懂一個問題!大家好!我是/小鄭搞碼事/的小鄭今天和大家分享一下關于NPM安裝包的版本號是如何更新的問題。版本號?先來看一張圖上圖就是2.29.1就是安裝包Momen…

css 向左白色箭頭,帶CSS的工具提示左側的箭頭

使用正確的CSS屬性在工具提示的右邊添加箭頭。您可以嘗試運行以下代碼以在左側添加帶有箭頭的工具提示示例html>.mytooltip .mytext {visibility: hidden;width: 140px;background-color: blue;color: #fff;z-index: 1;top: -5px;left: 110%;text-align: center;border-radi…

python有理數_Python中的as_integer_ratio()用于減少給定有理數的分數

在本教程中,我們將編寫一個程序,該程序返回兩個數字,它們的比率等于給定的float值。我們有一個稱為as_integer_ratio()的方法,可以幫助實現我們的目標。讓我們看一些例子。Input:1.5Output:3 / 2Input:5.3Output:5967269506265907…

js上拉加載ajax數據,原生ajax寫的上拉加載實例

上拉加載的思路1 上拉加載是要把屏幕拉到最底部的時候觸發ajax事件請求數據2.所有要獲取屏幕的高度 文檔的高度 和滾動的高度 下面的代碼是已經做好了兼容的可以直接拿來用Javascript:alert(document.body.clientWidth); //網頁可見區域寬(body)alert(document.body.clientHeig…

b站前端大佬_知乎大佬強烈熱推的5個自學網站,看了幾個月,月薪三千漲三萬...

原標題:知乎大佬強烈熱推的5個自學網站,看了幾個月,月薪三千漲三萬現在很多踏入了社會的小伙伴們經常會覺得為什么工作能力提升不上去,主要是因為很少利用業余的時間來學習一些跟自己工作有關的專業知識來充實自己,這其…

xp系統如何開啟共享服務器,xp系統怎么關閉共享服務 xp系統共享打印機如何設置...

XP系統雖然已經出來很久了,但是仍然還有很多用戶在使用,其實不管哪個系統只要電腦可以正常使用就行。很多XP用戶在開啟共享功能之后,想關閉但是又不知道如何設置,那么下面小編就為大家分享XP系統關閉共享服務的步驟教程&#xff0…

用udp協議通訊時怎樣得知目標機是否獲得了數據包?_和相親對象聊天,你屬于UDP還是CDP?...

有人說和相親對象聊天就像ping服務器每發一條消息就像發出一條Ping命令等待對方回復從而得到響應速度結果但是難受的是這個響應速度永遠無法做到秒級少點幾分鐘多則幾十分鐘甚至幾十個小時才有響應有時候真希望對方不要響應了就能判斷此處Ping不通從此斷了念想...你是否也像這位…

三星w系列vip服務器,高端人士候機專屬特權 三星W2017一張行走的VIP卡

原標題:高端人士候機專屬特權 三星W2017一張行走的VIP卡17年春運時間為1月13日至2月21日,如今春節假期已過,億萬人開始踏上了離鄉之路追尋夢想。每年春運都給交通帶來巨大壓力,今年為期40天的春運預計全國發送旅客或超29億人次。鐵…

阿酷快捷鍵怎么使用_必須收藏!Linux用戶必須知道的常用終端快捷鍵

點擊上方[全棧開發者社區]→右上角[...]→[設為星標?]簡介:以下是一些每個 Linux 用戶必須使用的鍵盤快捷鍵。使用命令行時,這些 Linux 快捷鍵將提升你的工作效率。你知道什么把專業用戶和普通用戶分開的嗎?掌握鍵盤快捷鍵。好的&#xff01…

checkbox ajax 不選中的值,php – 無法通過ajax傳遞checkbox的值

我有從數據庫收到的表://$id $_SESSION[staff_id];$teamResult getQuarter($leader_id);$count1 0;if (mysqli_num_rows($teamResult) > 0){?>1st Quarterwhile($row mysqli_fetch_array($teamResult)){$staff_id $row[staff_id];$username $row[usern…

3dmax天光渲染設置_【扮家家云渲染效果圖】3dmax測試全局照明效果|干貨教程...

首先打開場景文件,首先按快捷鍵8,打開環境和效果控制面板。下面有一個全局照明這樣一個選項卡,有染色、級別、環境光三個參數。默認情況下染色為白色,級別為1,環境光為黑色。此時我們可以單擊渲染,查看一下…

手寫table用ajax遍歷,原生js把數據循遍歷到前端table

用前端框架去給表格賦值簡直不要太容易和簡單。但是原生js就會復雜一些了。特別是按鈕事件的那個(“ )和 (’)特別讓人腦瓜子疼。最近做了一個功能,里面用的就是原生js實現。寫在js里面的代碼:(用的ajax請求將文件保存到服務器,返回的數據遍歷…

dbv mysql_MariaDB與MySQL對比 --- 對分布式事務的支持

本文最初于2016年底發表在我的個人微信公眾號里面,現略有修訂后發布在這里。本文的技術信息針對的是mysql-5.7.x和mariadb-10.1.9。MariaDB和MySQL兩者對分布式事務的支持有所不同,總的來說MySQL的支持更好,是完備的和可靠的(盡管后來也陸續發…