Linux jq命令的使用解讀
一. 簡介
jq 是 Linux 中的命令行工具,用于處理 JSON 數(shù)據(jù)。
你可以把它看作是 JSON 的 sed 或 awk,可以用來查看、過濾、修改、格式化 JSON 數(shù)據(jù)。

- GitHub 地址:
https://github.com/stedolan/jq - jq 官方網(wǎng)站:
https://stedolan.github.io/jq/
| option | 解釋 |
|---|---|
| -r | 輸出原始格式,而不是 JSON 編碼 ⇒ 去掉字段帶的"雙引號 |
| -R | 把輸入當(dāng)作原始字符串處理(Raw Input),而不是默認(rèn)的 JSON 結(jié)構(gòu)。 |
| -c | 將內(nèi)容壓縮到一行輸出。 |
| -s | 將輸入視為多個 JSON 對象,用于處理多個 JSON 對象的數(shù)組。 |
| filter | 解釋 |
|---|---|
| . | 表示當(dāng)前對象,用于訪問字段或?qū)傩浴?/td> |
| .fieldName | 選擇指定字段的值。 |
| [] | 用于遍歷數(shù)組元素。 |
| select(condition) | 根據(jù)條件選擇元素。 |
| map(transform) | 對數(shù)組中的每個元素應(yīng)用轉(zhuǎn)換操作。 |
| 格式轉(zhuǎn)換 | 解釋 |
|---|---|
| @csv | 輸出 CSV 格式(數(shù)組) |
| @tsv | 輸出 Tab 分隔格式 |
| @json | 把值轉(zhuǎn)成 JSON 字符串 |
二. 選項
2.1.
默認(rèn)的格式化輸出
apluser@FengYeHong-HP:~$ echo -n '{"id":1, "name":"zhangsan", "score":[75, 85, 90]}' | jq .
{
"id": 1,
"name": "zhangsan",
"score": [
75,
85,
90
]
}
2.2-c
-c選項將內(nèi)容壓縮到一行輸出
apluser@FengYeHong-HP:~$ cat data2.json
{
"id": 1,
"name": "zhangsan",
"score": [
75,
85,
90
]
}
apluser@FengYeHong-HP:~$ cat data2.json | jq -c
{"id":1,"name":"zhangsan","score":[75,85,90]}
2.3-r
-r選項可以去掉字段兩旁的"
apluser@FengYeHong-HP:~$ echo -n '{"id":1, "name":"zhangsan", "score":[75, 85, 90]}' | \
jq '.name' -r
zhangsan
2.4-R
- 把輸入當(dāng)作原始字符串處理(Raw Input),而不是默認(rèn)的 JSON 結(jié)構(gòu)。
sed 's/"//g':將csv中的"給替換為空。jq -R '[splits(",")]':將逗號分隔的文本行轉(zhuǎn)成數(shù)組。
apluser@FengYeHong-HP:~$ cat data.txt
"id","name","age","score"
"1","zhangsan","17","75"
"2","lisi","16","80"
"3","wangwu","18","85"
"4","zhaoliu","18","90"
apluser@FengYeHong-HP:~$ awk 'NR > 1' data.txt | sed 's/"http://g' | jq -R '[splits(",")]'
[
"1",
"zhangsan",
"17",
"75"
]
[
"2",
"lisi",
"16",
"80"
]
[
"3",
"wangwu",
"18",
"85"
]
[
"4",
"zhaoliu",
"18",
"90"
]
三. 字段提取
3.1 普通字段
提取單個字段
apluser@FengYeHong-HP:~$ echo -n '{"id":1, "name":"zhangsan", "score":[75, 85, 90]}' | \
> jq '.name'
"zhangsan"
提取多個字段
apluser@FengYeHong-HP:~$ echo -n '{"id":1, "name":"zhangsan", "score":[75, 85, 90]}' | \
jq '.id, .name'
1
"zhangsan"
提取嵌套字段
apluser@FengYeHong-HP:~$ cat data3.json
{
"name": "Alice",
"age": 26,
"city": "New York",
"info": {
"sub_id": 10,
"sub_address": "地球",
"sub_num_list": [100, 200, 300]
}
}
apluser@FengYeHong-HP:~$ cat data3.json | jq '.info.sub_address'
"地球"
# | 的管道符起到過濾作用
apluser@FengYeHong-HP:~$ cat data3.json | jq '.info | .sub_address'
"地球"
3.2 數(shù)組字段
提取數(shù)組字段中的指定元素,支持切片提取(類似于python的list語法)
apluser@FengYeHong-HP:~$ cat data3.json | jq '.info.sub_num_list[0]' 100 apluser@FengYeHong-HP:~$ cat data3.json | jq '.info.sub_num_list[1]' 200 apluser@FengYeHong-HP:~$ cat data3.json | jq '.info.sub_num_list[2]' 300 apluser@FengYeHong-HP:~$ cat data3.json | jq '.info.sub_num_list[0:2]' [ 100, 200 ]
數(shù)組字段中的對象屬性
apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500}]}' | \
jq '.items[].name'
"すてきな雑貨"
"格好いい置物"
apluser@FengYeHong-HP:~$ cat data1.json
[
{
"name": "Alice",
"age": 25,
"city": "New York"
},
{
"name": "Bob",
"age": 30,
"city": "Los Angeles"
},
{
"name": "Charlie",
"age": 22,
"city": "Chicago"
}
]
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ cat data1.json | jq '.[] | .age'
25
30
22
apluser@FengYeHong-HP:~$ cat data1.json | jq '.[].age'
25
30
22
數(shù)組展開
apluser@FengYeHong-HP:~$ echo -n '[75, 85, 90]' | jq '.[]' 75 85 90
四. 編輯
4.1 字段更新
更新一個字段
apluser@FengYeHong-HP:~$ echo -n '{"name":"Alice","age":25,"city":"New York"}' | jq '.name = "賈飛天"'
{
"name": "賈飛天",
"age": 25,
"city": "New York"
}
更新多個字段
apluser@FengYeHong-HP:~$ echo -n '{"name":"Alice","age":25,"city":"New York"}' | jq '. += {"name":"賈飛天", "age":26}'
{
"name": "賈飛天",
"age": 26,
"city": "New York"
}
4.2 字段追加
追加一個字段
apluser@FengYeHong-HP:~$ echo -n '{"name":"Alice","age":25,"city":"New York"}' | jq '.country = "USA"'
{
"name": "Alice",
"age": 25,
"city": "New York",
"country": "USA"
}
追加一個字段的同時,修改既存的字段
apluser@FengYeHong-HP:~$ echo -n '{"name":"Alice","age":25,"city":"New York"}' | jq '.country = "USA" | .age = 50'
{
"name": "Alice",
"age": 50,
"city": "New York",
"country": "USA"
}
4.3 字段刪除
刪除一個字段
apluser@FengYeHong-HP:~$ echo -n '{"name":"Alice","age":25,"city":"New York"}' | jq 'del(.city)'
{
"name": "Alice",
"age": 25
}
4.4 轉(zhuǎn)換為csv格式
apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500},{"item_id":3,"name":"ナイスなお皿","price":4500}]}' | \
jq .
{
"items": [
{
"item_id": 1,
"name": "すてきな雑貨",
"price": 2500
},
{
"item_id": 2,
"name": "格好いい置物",
"price": 4500
},
{
"item_id": 3,
"name": "ナイスなお皿",
"price": 4500
}
]
}
apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500},{"item_id":3,"name":"ナイスなお皿","price":4500}]}' | \
jq '.items[] | [.item_id, .name, .price] | @csv' -r
1,"すてきな雑貨",2500
2,"格好いい置物",4500
3,"ナイスなお皿",4500
五. 過濾
5.1 字段整合
apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500}]}' | \
jq '.items[] | { name: .name, yen: .price }'
{
"name": "すてきな雑貨",
"yen": 2500
}
{
"name": "格好いい置物",
"yen": 4500
}
5.2 select過濾
一個條件
apluser@FengYeHong-HP:~$ cat data1.json
[
{
"name": "Alice",
"age": 25,
"city": "New York"
},
{
"name": "Bob",
"age": 30,
"city": "Los Angeles"
},
{
"name": "Charlie",
"age": 22,
"city": "Chicago"
}
]
apluser@FengYeHong-HP:~$ cat data1.json | jq '.[] | select(.age >= 25) | .name, .city'
"Alice"
"New York"
"Bob"
"Los Angeles"
apluser@FengYeHong-HP:~$ cat data1.json | jq '.[] | select(.age >= 25) | .name, .city' | paste -d "," - -
"Alice","New York"
"Bob","Los Angeles"
多個條件
apluser@FengYeHong-HP:~$ cat data1.json | jq '.[] | select(.age >= 25 and .age <= 30) | .name, .city' | sort "Alice" "Bob" "Los Angeles" "New York"
六. 函數(shù)
6.1 統(tǒng)計函數(shù)
6.1.1 add
apluser@FengYeHong-HP:~$ echo '1 2 3 4' | jq -s 'add' 10 apluser@FengYeHong-HP:~$ seq 4 | jq -s 'add' 10
apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500}]}' | \
jq '[.items[].price]'
[
2500,
4500
]
apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500}]}' | \
jq '[.items[].price] | add'
7000
6.1.2 map
apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500}]}' | \
jq '.items | map({ name: .name, yen: .price })'
[
{
"name": "すてきな雑貨",
"yen": 2500
},
{
"name": "格好いい置物",
"yen": 4500
}
]
apluser@FengYeHong-HP:~$ seq 4 | jq -s 'map(tostring) | join(",")'
"1,2,3,4"
6.1.3 reduce
apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500}]}' | jq '.items[]'
{
"item_id": 1,
"name": "すてきな雑貨",
"price": 2500
}
{
"item_id": 2,
"name": "格好いい置物",
"price": 4500
}
apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500}]}' | \
jq 'reduce .items[] as $item (0; . + $item.price)'
7000
6.1.4 unique
apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500},{"item_id":3,"name":"ナイスなお皿","price":4500}]}' | \
jq '[.items[].price]'
[
2500,
4500,
4500
]
apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500},{"item_id":3,"name":"ナイスなお皿","price":4500}]}' | \
jq '[.items[].price] | unique'
[
2500,
4500
]
6.1.5 length
apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500},{"item_id":3,"name":"ナイスなお皿","price":4500}]}' | \
jq '.items'
[
{
"item_id": 1,
"name": "すてきな雑貨",
"price": 2500
},
{
"item_id": 2,
"name": "格好いい置物",
"price": 4500
},
{
"item_id": 3,
"name": "ナイスなお皿",
"price": 4500
}
]
apluser@FengYeHong-HP:~$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500},{"item_id":3,"name":"ナイスなお皿","price":4500}]}' | \
jq '.items | length'
3
6.2 字符串函數(shù)
6.2.1 contains
apluser@FengYeHong-HP:~$ echo hello | jq -R 'contains("he")'
true
6.2.2startswith/endswith
apluser@FengYeHong-HP:~$ echo hello | jq -R 'startswith("he")'
true
apluser@FengYeHong-HP:~$ echo hello | jq -R 'endswith("llo")'
true
6.2.3ltrimstr/rtrimstr
apluser@FengYeHong-HP:~$ echo ' hello ' | jq -R 'ltrimstr(" ") | rtrimstr(" ")' -r
hello
6.2.4 大小寫轉(zhuǎn)換
apluser@FengYeHong-HP:~$ echo hello | jq -R 'ascii_downcase' -r hello apluser@FengYeHong-HP:~$ echo hello | jq -R 'ascii_upcase' -r HELLO
6.2.5 json對象與json字符串轉(zhuǎn)換
json字符串 ⇒ json對象
apluser@FengYeHong-HP:~$ echo -n '{"id":1,"name":"zhangsan","age":"17","attr":"{\"weight\":56,\"height\":178}"}' | \
jq '.attr = (.attr|fromjson)'
{
"id": 1,
"name": "zhangsan",
"age": "17",
"attr": {
"weight": 56,
"height": 178
}
}
json對象 ⇒ json字符串
apluser@FengYeHong-HP:~$ echo -n '{"id":1,"name":"zhangsan","age":"17","attr":{"weight":56,"height":178}}' | \
jq '.attr = (.attr|tojson)'
{
"id": 1,
"name": "zhangsan",
"age": "17",
"attr": "{\"weight\":56,\"height\":178}"
}
apluser@FengYeHong-HP:~$ echo -n '{"id":1,"name":"zhangsan","age":"17","attr":{"weight":56,"height":178}}' | \
jq '.attr = (.attr|tojson)' -c
{"id":1,"name":"zhangsan","age":"17","attr":"{\"weight\":56,\"height\":178}"}
6.3 字段
apluser@FengYeHong-HP:~$ cat data3.json
{
"name": "Alice",
"age": 26,
"city": "New York",
"info": {
"sub_id": 10,
"sub_address": "地球",
"sub_num_list": [100, 200, 300]
}
}
6.3.1 keys
- 獲取所有
key
apluser@FengYeHong-HP:~$ cat data3.json | jq '. | keys' [ "age", "city", "info", "name" ]
6.3.2 values
- 獲取所有
value - ※
jq-1.6的.values方法不好用,此處用[.[]]開替代
apluser@FengYeHong-HP:~$ jq --version
jq-1.6
apluser@FengYeHong-HP:~$ cat data3.json | jq '[.[]]'
[
"Alice",
26,
"New York",
{
"sub_id": 10,
"sub_address": "地球",
"sub_num_list": [
100,
200,
300
]
}
]
6.3.3 to_entries
- 轉(zhuǎn)換為鍵值對數(shù)組
apluser@FengYeHong-HP:~$ cat data3.json | jq '. | to_entries'
[
{
"key": "name",
"value": "Alice"
},
{
"key": "age",
"value": 26
},
{
"key": "city",
"value": "New York"
},
{
"key": "info",
"value": {
"sub_id": 10,
"sub_address": "地球",
"sub_num_list": [
100,
200,
300
]
}
}
]
七. 排序
排序之前
apluser@FengYeHong-HP:~$ echo '[{"name": "Tom", "age": 25},{"name": "Jerry", "age": 18},{"name": "Alice", "age": 30}]' | jq
[
{
"name": "Tom",
"age": 25
},
{
"name": "Jerry",
"age": 18
},
{
"name": "Alice",
"age": 30
}
]
按照指定 字段(age) 升序排序
apluser@FengYeHong-HP:~$ echo '[{"name": "Tom", "age": 25},{"name": "Jerry", "age": 18},{"name": "Alice", "age": 30}]' | \
jq 'sort_by(.age)'
[
{
"name": "Jerry",
"age": 18
},
{
"name": "Tom",
"age": 25
},
{
"name": "Alice",
"age": 30
}
]
按照指定 字段(age) 降序排序
apluser@FengYeHong-HP:~$ echo '[{"name": "Tom", "age": 25},{"name": "Jerry", "age": 18},{"name": "Alice", "age": 30}]' | \
jq 'sort_by(.age) | reverse'
[
{
"name": "Alice",
"age": 30
},
{
"name": "Tom",
"age": 25
},
{
"name": "Jerry",
"age": 18
}
]
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
LAMP服務(wù)器性能優(yōu)化技巧之Apache服務(wù)器優(yōu)化
目前LAMP (Linux + Apache + MySQL + PHP) 近幾年來發(fā)展迅速,已經(jīng)成為Web 服務(wù)器的事實標(biāo)準(zhǔn)。本文我們將介紹基于LAMP組合的服務(wù)器的性能優(yōu)化技巧2012-02-02
linux 驅(qū)動編寫之虛擬字符設(shè)備的編寫實例詳解
這篇文章主要介紹了linux 驅(qū)動編寫之虛擬字符設(shè)備的編寫實例詳解的相關(guān)資料,需要的朋友可以參考下2017-01-01
Ubuntu 16.04與Apache虛擬主機配置的步驟詳解
這篇文章主要給大家介紹了關(guān)于Ubuntu 16.04與Apache虛擬主機配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用ubuntu16.04系統(tǒng)具有一定的參考學(xué)習(xí)價值,需要的朋友們來一起看看吧。2018-04-04
ubuntu下apache服務(wù)器操作方法小結(jié)
這篇文章主要介紹了ubuntu下apache服務(wù)器操作方法小結(jié),非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-12-12
Linux應(yīng)用程序使用寫文件調(diào)試程序的方法
今天小編就為大家分享一篇關(guān)于Linux應(yīng)用程序使用寫文件調(diào)試程序的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12

