jq簡(jiǎn)介
jq可以對(duì)json數(shù)據(jù)進(jìn)行分片涂召、過(guò)濾坠非、映射和轉(zhuǎn)換,和sed芹扭、awk麻顶、grep等命令一樣,都可以讓你輕松地把玩文本舱卡。它能輕松地把你擁有的數(shù)據(jù)轉(zhuǎn)換成你期望的格式辅肾,而且需要寫(xiě)的程序通常也比你期望的更加簡(jiǎn)短。
jq是用C編寫(xiě)轮锥,沒(méi)有運(yùn)行時(shí)依賴矫钓,所以幾乎可以運(yùn)行在任何系統(tǒng)上。預(yù)編譯的二進(jìn)制文件可以直接在Linux舍杜、OS X和windows系統(tǒng)上運(yùn)行新娜,當(dāng)然在linux和OS X系統(tǒng)你需要賦與其可執(zhí)行權(quán)限;在linux系統(tǒng)中也可以直接用yum安裝既绩。
下載頁(yè)面:
https://stedolan.github.io/jq/download/
在知道jq命令之前概龄,我在linux系統(tǒng)中極少直接去命令去處理json數(shù)據(jù),除非只是簡(jiǎn)單地從中過(guò)濾某個(gè)字符串饲握,那就用grep結(jié)合正則表達(dá)式來(lái)解決私杜。所以,掌握了jq命令救欧,則可以讓linux命令和shell腳本在處理json數(shù)據(jù)時(shí)變得得心應(yīng)手衰粹。
jq簡(jiǎn)明教程
例子文件
為了便于演示jq的功能,我們?cè)谖募son.txt中保存如下內(nèi)容:
cat json.txt
[{"name":"站長(zhǎng)工具","url":"http://tool.chinaz.com","address":{"city":"廈門(mén)","country":"中國(guó)"},"arrayBrowser":[{"name":"Google","url":"http://www.google.com"},{"name":"Baidu","url":"http://www.baidu.com"}]},{"name":"站長(zhǎng)之家","url":"http://tool.zzhome.com","address":{"city":"大連","country":"中國(guó)"},"arrayBrowser":[{"name":"360","url":"http://www.so.com"},{"name":"bing","url":"http://www.bing.com"}]}]
為了讓你理解文件中的內(nèi)容笆怠,對(duì)比jq的效果铝耻,在json解析工具中顯示為:
"."
最簡(jiǎn)單的jq程序是表達(dá)式".",它不改變輸入蹬刷,但可以將其優(yōu)美地輸出瓢捉,便于閱讀和理解。
cat json.txt | jq '.'
[
{
"name": "站長(zhǎng)工具",
"url": "http://tool.chinaz.com",
"address": {
"city": "廈門(mén)",
"country": "中國(guó)"
},
"arrayBrowser": [
{
"name": "Google",
"url": "http://www.google.com"
},
{
"name": "Baidu",
"url": "http://www.baidu.com"
}
]
},
{
"name": "站長(zhǎng)之家",
"url": "http://tool.zzhome.com",
"address": {
"city": "大連",
"country": "中國(guó)"
},
"arrayBrowser": [
{
"name": "360",
"url": "http://www.so.com"
},
{
"name": "bing",
"url": "http://www.bing.com"
}
]
}
]
[index]
輸出列表中的第一個(gè)元素办成,可以使用[index]:
cat json.txt | jq '.[0]'
{
"name": "站長(zhǎng)工具",
"url": "http://tool.chinaz.com",
"address": {
"city": "廈門(mén)",
"country": "中國(guó)"
},
"arrayBrowser": [
{
"name": "Google",
"url": "http://www.google.com"
},
{
"name": "Baidu",
"url": "http://www.baidu.com"
}
]
}
管道線|
jq支持管道線|
泊柬,它如同linux命令中的管道線——把前面命令的輸出當(dāng)作是后面命令的輸入。如下命令把.[0]
作為{...}
的輸入诈火,進(jìn)而訪問(wèn)嵌套的屬性兽赁,如.name
和.address.city
状答。
觀察如下幾個(gè)命令,通過(guò)改變|
前后的輸入和輸出來(lái)達(dá)到不同的效果:
cat json.txt | jq '.[0] | {name:.name,city:.address.city}'
{
"name": "站長(zhǎng)工具",
"city": "廈門(mén)"
}
cat json.txt | jq '.[0] | {name:.arrayBrowser[1].name,city:.address.city}'
{
"name": "Baidu",
"city": "廈門(mén)"
}
cat json.txt | jq ".[] | {name:.arrayBrowser[1].name,city:.address.city}"
{
"name": "Baidu",
"city": "廈門(mén)"
}
{
"name": "bing",
"city": "大連"
}
[]
如果希望把jq的輸出當(dāng)作一個(gè)數(shù)組刀崖,可以在前后加上[]
:
cat json.txt | jq "[.[] | {name:.arrayBrowser[1].name,city:.address.city}]"
[
{
"name": "Baidu",
"city": "廈門(mén)"
},
{
"name": "bing",
"city": "大連"
}
]
自定義key
在{}中惊科,冒號(hào)前面的名字是映射的名稱,你可以任意修改亮钦,如:
cat json.txt | jq "[.[] | {name_001:.arrayBrowser[1].name,city_002:.address.city}]"
[
{
"name_001": "Baidu",
"city_002": "廈門(mén)"
},
{
"name_001": "bing",
"city_002": "大連"
}
]
擴(kuò)展閱讀
http://www.json.cn/wiki.html
https://stedolan.github.io/jq/tutorial/