亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

shell腳本處理JSON數據工具jq

2024-06-28 13:23:13
字體:
來源:轉載
供稿:網友
shell腳本處理JSON數據工具jq

shell腳本如何方便地處理JSON格式的數據呢,這里介紹一個工具:jq。

官方教程簡單翻譯如下。

1、獲取JSON數據

我們以github上jq項目最新5條評論的JSON數據為例。獲取數據如下:

curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5'

結果如下:

[  {    "sha": "d25341478381063d1c76e81b3a52e0592a7c997f",    "commit": {      "author": {        "name": "Stephen Dolan",        "email": "mu@netsoc.tcd.ie",        "date": "2013-06-22T16:30:59Z"      },      "committer": {        "name": "Stephen Dolan",        "email": "mu@netsoc.tcd.ie",        "date": "2013-06-22T16:30:59Z"      },      "message": "Merge pull request #162 from stedolan/utf8-fixes/n/nUtf8 fixes. Closes #161",      "tree": {        "sha": "6ab697a8dfb5a96e124666bf6d6213822599fb40",        "url": "https://api.github.com/repos/stedolan/jq/git/trees/6ab697a8dfb5a96e124666bf6d6213822599fb40"      },      "url": "https://api.github.com/repos/stedolan/jq/git/commits/d25341478381063d1c76e81b3a52e0592a7c997f",      "comment_count": 0    },    "url": "https://api.github.com/repos/stedolan/jq/commits/d25341478381063d1c76e81b3a52e0592a7c997f",    "html_url": "https://github.com/stedolan/jq/commit/d25341478381063d1c76e81b3a52e0592a7c997f",    "comments_url": "https://api.github.com/repos/stedolan/jq/commits/d25341478381063d1c76e81b3a52e0592a7c997f/comments",    "author": {      "login": "stedolan",    ...
2、高亮并按屬性排序顯示

用 jq '.'即可:

curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'

結果:

[  {    "parents": [      {        "html_url": "https://github.com/stedolan/jq/commit/54b9c9bdb225af5d886466d72f47eafc51acb4f7",        "url": "https://api.github.com/repos/stedolan/jq/commits/54b9c9bdb225af5d886466d72f47eafc51acb4f7",        "sha": "54b9c9bdb225af5d886466d72f47eafc51acb4f7"      },      {        "html_url": "https://github.com/stedolan/jq/commit/8b1b503609c161fea4b003a7179b3fbb2dd4345a",        "url": "https://api.github.com/repos/stedolan/jq/commits/8b1b503609c161fea4b003a7179b3fbb2dd4345a",        "sha": "8b1b503609c161fea4b003a7179b3fbb2dd4345a"      }    ],    "committer": {      "type": "User",      "received_events_url": "https://api.github.com/users/stedolan/received_events",      "events_url": "https://api.github.com/users/stedolan/events{/PRivacy}",      "repos_url": "https://api.github.com/users/stedolan/repos",      "organizations_url": "https://api.github.com/users/stedolan/orgs",...

這里的評論內容比較多,我們現在想拿第一個評論。

3、獲取數組某一項
curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.[0]'

結果:

{  "parents": [    {      "html_url": "https://github.com/stedolan/jq/commit/54b9c9bdb225af5d886466d72f47eafc51acb4f7",      "url": "https://api.github.com/repos/stedolan/jq/commits/54b9c9bdb225af5d886466d72f47eafc51acb4f7",      "sha": "54b9c9bdb225af5d886466d72f47eafc51acb4f7"    },    {      "html_url": "https://github.com/stedolan/jq/commit/8b1b503609c161fea4b003a7179b3fbb2dd4345a",      "url": "https://api.github.com/repos/stedolan/jq/commits/8b1b503609c161fea4b003a7179b3fbb2dd4345a",      "sha": "8b1b503609c161fea4b003a7179b3fbb2dd4345a"    }  ],  "committer": {    "type": "User",    "received_events_url": "https://api.github.com/users/stedolan/received_events",    "events_url": "https://api.github.com/users/stedolan/events{/privacy}",    "repos_url": "https://api.github.com/users/stedolan/repos",    "organizations_url": "https://api.github.com/users/stedolan/orgs",    "subscriptions_url": "https://api.github.com/users/stedolan/subscriptions",    "starred_url": "https://api.github.com/users/stedolan/starred{/owner}{/repo}",    "gists_url": "https://api.github.com/users/stedolan/gists{/gist_id}",    "login": "stedolan",    "id": 79765,    "avatar_url": "https://1.gravatar.com/avatar/31de909d8e55dd07ed782d92ece59842?d=https%3A%2F%2Fidenticons.github.com%2Ffc5b6765b1c9cfaecea48ae71df4d279.png",    "gravatar_id": "31de909d8e55dd07ed782d92ece59842",    "url": "https://api.github.com/users/stedolan",    "html_url": "https://github.com/stedolan",    "followers_url": "https://api.github.com/users/stedolan/followers",    "following_url": "https://api.github.com/users/stedolan/following{/other_user}"  },  "author": {    "type": "User",    "received_events_url": "https://api.github.com/users/stedolan/received_events",    "events_url": "https://api.github.com/users/stedolan/events{/privacy}",    "repos_url": "https://api.github.com/users/stedolan/repos",    "organizations_url": "https://api.github.com/users/stedolan/orgs",    "subscriptions_url": "https://api.github.com/users/stedolan/subscriptions",    "starred_url": "https://api.github.com/users/stedolan/starred{/owner}{/repo}",    "gists_url": "https://api.github.com/users/stedolan/gists{/gist_id}",    "login": "stedolan",    "id": 79765,    "avatar_url": "https://1.gravatar.com/avatar/31de909d8e55dd07ed782d92ece59842?d=https%3A%2F%2Fidenticons.github.com%2Ffc5b6765b1c9cfaecea48ae71df4d279.png",    "gravatar_id": "31de909d8e55dd07ed782d92ece59842",    "url": "https://api.github.com/users/stedolan",    "html_url": "https://github.com/stedolan",    "followers_url": "https://api.github.com/users/stedolan/followers",    "following_url": "https://api.github.com/users/stedolan/following{/other_user}"  },  "comments_url": "https://api.github.com/repos/stedolan/jq/commits/d25341478381063d1c76e81b3a52e0592a7c997f/comments",  "html_url": "https://github.com/stedolan/jq/commit/d25341478381063d1c76e81b3a52e0592a7c997f",  "url": "https://api.github.com/repos/stedolan/jq/commits/d25341478381063d1c76e81b3a52e0592a7c997f",  "commit": {    "comment_count": 0,    "url": "https://api.github.com/repos/stedolan/jq/git/commits/d25341478381063d1c76e81b3a52e0592a7c997f",    "tree": {      "url": "https://api.github.com/repos/stedolan/jq/git/trees/6ab697a8dfb5a96e124666bf6d6213822599fb40",      "sha": "6ab697a8dfb5a96e124666bf6d6213822599fb40"    },    "message": "Merge pull request #162 from stedolan/utf8-fixes/n/nUtf8 fixes. Closes #161",    "committer": {      "date": "2013-06-22T16:30:59Z",      "email": "mu@netsoc.tcd.ie",      "name": "Stephen Dolan"    },    "author": {      "date": "2013-06-22T16:30:59Z",      "email": "mu@netsoc.tcd.ie",      "name": "Stephen Dolan"    }  },  "sha": "d25341478381063d1c76e81b3a52e0592a7c997f"}
View Code

可以看到,我們已經拿到了一條完整的評論內容。但我們真正關心的只是評論內容和用戶名,下面來獲取這兩項內容。

4、自定義格式輸出某一項
jq '.[0] | {message: .commit.message, name: .commit.committer.name}'

結果:

{  "name": "Stephen Dolan",  "message": "Merge pull request #162 from stedolan/utf8-fixes/n/nUtf8 fixes. Closes #161"}

我們可以看到,已經拿到了想要的內容,并且已經按我們自己定義的格式顯示了。

這里 | 后面的內容是以前面的內容為輸入的,.commit中的 . 就是指 .[0] 中的內容。

5、自定義格式輸出多項
jq '.[] | {message: .commit.message, name: .commit.committer.name}'

結果:

{  "name": "Stephen Dolan",  "message": "Merge pull request #162 from stedolan/utf8-fixes/n/nUtf8 fixes. Closes #161"}{  "name": "Stephen Dolan",  "message": "Reject all overlong UTF8 sequences."}{  "name": "Stephen Dolan",  "message": "Fix various UTF8 parsing bugs./n/nIn particular, parse bad UTF8 by replacing the broken bits with U+FFFD/nand resychronise correctly after broken sequences."}{  "name": "Stephen Dolan",  "message": "Fix example in manual for `floor`. See #155."}{  "name": "Nicolas Williams",  "message": "Document floor"}

這里 .[] 獲取的是數組中的所有項。

我們看到,結果是一個個獨立的JSON對象,如何把結果組合成一個數組呢?

6、以數組形式自定義輸出多項
jq '[.[] | {message: .commit.message, name: .commit.committer.name}]'

結果:

[  {    "name": "Stephen Dolan",    "message": "Merge pull request #162 from stedolan/utf8-fixes/n/nUtf8 fixes. Closes #161"  },  {    "name": "Stephen Dolan",    "message": "Reject all overlong UTF8 sequences."  },  {    "name": "Stephen Dolan",    "message": "Fix various UTF8 parsing bugs./n/nIn particular, parse bad UTF8 by replacing the broken bits with U+FFFD/nand resychronise correctly after broken sequences."  },  {    "name": "Stephen Dolan",    "message": "Fix example in manual for `floor`. See #155."  },  {    "name": "Nicolas Williams",    "message": "Document floor"  }]

我們可以看到,只要在上一步的命令中內容的兩端加個中括號即可。

最后,我們如果想獲取每個評論的引用評論的url(在parents節點中,有一個或多個)呢?

7、獲取其他內容
jq '[.[] | {message: .commit.message, name: .commit.committer.name, parents: [.parents[].html_url]}]'

結果:

[  {    "parents": [      "https://github.com/stedolan/jq/commit/54b9c9bdb225af5d886466d72f47eafc51acb4f7",      "https://github.com/stedolan/jq/commit/8b1b503609c161fea4b003a7179b3fbb2dd4345a"    ],    "name": "Stephen Dolan",    "message": "Merge pull request #162 from stedolan/utf8-fixes/n/nUtf8 fixes. Closes #161"  },  {    "parents": [      "https://github.com/stedolan/jq/commit/ff48bd6ec538b01d1057be8e93b94eef6914e9ef"    ],    "name": "Stephen Dolan",    "message": "Reject all overlong UTF8 sequences."  },  {    "parents": [      "https://github.com/stedolan/jq/commit/54b9c9bdb225af5d886466d72f47eafc51acb4f7"    ],    "name": "Stephen Dolan",    "message": "Fix various UTF8 parsing bugs./n/nIn particular, parse bad UTF8 by replacing the broken bits with U+FFFD/nand resychronise correctly after broken sequences."  },  {    "parents": [      "https://github.com/stedolan/jq/commit/3dcdc582ea993afea3f5503a78a77675967ecdfa"    ],    "name": "Stephen Dolan",    "message": "Fix example in manual for `floor`. See #155."  },  {    "parents": [      "https://github.com/stedolan/jq/commit/7c4171d414f647ab08bcd20c76a4d8ed68d9c602"    ],    "name": "Nicolas Williams",    "message": "Document floor"  }]

這里用 .parents[].html_url 獲取當前項的 parents 節點中的所有項的 html_url 屬性的內容,然后兩邊加個中括號組裝成數組輸出。

怎么樣,經過這個例子可以看出,用jq處理JSON數據還是很方便強大的吧。

8、注意點

jq能處理的需要是嚴格的JSON格式數據,JSON對象和JSON字符串是不行的,如下面的兩種格式數據jq是不能處理的:

json對象:

{    a: 1,    b: {        c: "abc"    }}

json字符串:

'{"a":1,"b":{"c":"abc"}}'

正確的JSON格式:

{    "a": 1,    "b": {        "c": "abc"    }}

關于什么是JSON格式數據,請參考:http://www.json.org/

本文原文出自十年后的盧哥哥:http://www.CUOXin.com/lurenjiashuo/,轉載請注明出處。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩中文字幕亚洲| 91精品国产高清久久久久久91| 欧美成人剧情片在线观看| 国产香蕉一区二区三区在线视频| 精品久久久久久久久久久| 欧美性猛交xxxx乱大交3| 国产日本欧美一区二区三区| 亚洲自拍偷拍一区| 久久精品国产亚洲一区二区| 欧美激情视频播放| 亚洲91精品在线观看| 欧美激情视频给我| 欧美性感美女h网站在线观看免费| 在线观看久久av| 国产中文日韩欧美| 日本老师69xxx| 久久躁狠狠躁夜夜爽| 97人洗澡人人免费公开视频碰碰碰| 欧美日韩中文字幕在线视频| 91亚洲人电影| 成人精品一区二区三区电影免费| 夜夜躁日日躁狠狠久久88av| 91在线网站视频| 激情久久av一区av二区av三区| 亚洲精品日产aⅴ| 久久久久久国产精品美女| 国产精品v日韩精品| 91精品国产高清| 中文字幕9999| 91在线高清免费观看| 51精品国产黑色丝袜高跟鞋| 久久久久久久久久婷婷| 国产精品久久久久av免费| www国产精品com| 日韩欧美aaa| 中文字幕亚洲一区二区三区五十路| 午夜精品久久久久久久男人的天堂| 亚洲国产成人爱av在线播放| 国产精品久久久久久婷婷天堂| 最新国产成人av网站网址麻豆| 中文字幕亚洲一区二区三区| 欧美孕妇孕交黑巨大网站| 久久久日本电影| 亚洲成人免费网站| 亚洲最大成人免费视频| 日韩高清a**址| 伊人久久大香线蕉av一区二区| 91成人天堂久久成人| 久久久久久av| 美日韩精品免费观看视频| 国产ts一区二区| 国产精品一区二区久久精品| 成人信息集中地欧美| 亚洲精品ady| 亚洲自拍小视频免费观看| 97精品国产aⅴ7777| 欧美日韩第一页| 亚洲毛片在线观看.| 日本视频久久久| 欧美在线亚洲一区| 欧美激情精品久久久久久黑人| 亚洲国产精品成人一区二区| 欧美成aaa人片免费看| 日韩av资源在线播放| 亚洲天堂av在线播放| 夜夜狂射影院欧美极品| 久久久欧美一区二区| 日韩禁在线播放| 欧美一级黑人aaaaaaa做受| 色综合男人天堂| 国产精品久久9| 亚洲色无码播放| 亚洲欧洲午夜一线一品| 日韩中文字幕在线视频| 精品国模在线视频| 综合国产在线视频| 日韩av在线免播放器| 一本大道香蕉久在线播放29| 日韩av在线直播| 亚洲国产三级网| 亚洲一区二区三区视频| 欧美在线视频播放| 欧美电影在线免费观看网站| 国产精品免费一区| 欧美黑人一级爽快片淫片高清| 中文字幕日韩欧美在线视频| 欧美另类xxx| 久久色精品视频| 国产精品自产拍在线观看| 亚洲图片制服诱惑| 欧美一区二区视频97| 伊人一区二区三区久久精品| 国产69精品久久久久9999| 亚洲理论在线a中文字幕| 欧美激情小视频| 欧美极品少妇xxxxx| 欧美日韩国产精品一区二区三区四区| 92看片淫黄大片欧美看国产片| 久久亚洲精品国产亚洲老地址| 欧美成人精品在线| 国产亚洲精品一区二555| 欧美一二三视频| 欧美巨大黑人极品精男| 国产精品欧美一区二区| 精品少妇一区二区30p| 欧美激情在线有限公司| 日韩精品中文字幕视频在线| 欧美一区亚洲一区| 欧美大片在线看免费观看| 亚洲精品自拍第一页| 国产精品99久久久久久www| 国产视频亚洲精品| 成人免费自拍视频| 中文字幕亚洲无线码在线一区| 日本19禁啪啪免费观看www| 欧美自拍视频在线观看| 成人在线视频网站| 久久福利网址导航| 中文字幕日韩在线观看| 欧美成人精品激情在线观看| 中文字幕免费国产精品| 国产色婷婷国产综合在线理论片a| 亚洲国产成人一区| 国产精品88a∨| 麻豆国产va免费精品高清在线| 97精品久久久中文字幕免费| 亚洲一区亚洲二区亚洲三区| 一区二区三区www| 国产精品亚洲一区二区三区| 韩国三级日本三级少妇99| 国产精品黄页免费高清在线观看| 欧美成人精品h版在线观看| 国产精品福利无圣光在线一区| 欧美精品18videosex性欧美| 亚洲毛片在线免费观看| 亚洲精品国产综合久久| 91精品久久久久久久久久久久久| 亚洲无限av看| 亚洲欧美色婷婷| 91在线视频一区| 国产福利视频一区| 日韩精品欧美国产精品忘忧草| 全色精品综合影院| 欧美日韩国产中字| 色偷偷噜噜噜亚洲男人的天堂| 奇米4444一区二区三区| 伊人久久精品视频| 欧洲美女7788成人免费视频| 中文一区二区视频| 97在线观看视频| 91情侣偷在线精品国产| 国产99视频精品免视看7| 欧美乱大交xxxxx| 国产成人精品视| 午夜精品久久久久久久99黑人| 久久亚洲精品小早川怜子66| 亚洲香蕉伊综合在人在线视看| 亚洲精品视频在线观看视频| 久久久成人的性感天堂| 亚洲国产天堂久久国产91| 精品久久久国产精品999| 国外日韩电影在线观看| 欧美激情在线观看视频| 亚洲精品国产精品自产a区红杏吧|