Linux jq 命令講解與實(shí)戰(zhàn)操作
一、概述
jq 是一個(gè)強(qiáng)大的命令行工具,用于處理 JSON 格式的數(shù)據(jù)。它可以幫助你查詢、過濾、修改和處理 JSON 數(shù)據(jù),使得在命令行環(huán)境下處理 JSON 變得非常方便。
圖片
GitHub 地址:https://github.com/stedolan/jqjq 官方網(wǎng)站: https://stedolan.github.io/jq/
二、jq 命令安裝
yum install epel-release
yum install -y jq
三、jq 命令語(yǔ)法與示例詳解
jq 命令有很多參數(shù)和選項(xiàng),可以幫助你處理和轉(zhuǎn)換 JSON 數(shù)據(jù)。以下是一些常用的 jq 命令參數(shù)和選項(xiàng):
1)基本用法
jq [options] [filter] [file]
- options: 可選參數(shù),用于指定 jq 的選項(xiàng)。
- filter: 必需參數(shù),用于指定 JSON 數(shù)據(jù)的查詢和轉(zhuǎn)換操作。
- file: 可選參數(shù),要處理的 JSON 數(shù)據(jù)文件。
2)常用選項(xiàng)
- -r: 輸出原始格式,而不是 JSON 編碼。
- -c: 輸出時(shí)將結(jié)果按行分隔。
- -s: 將輸入視為多個(gè) JSON 對(duì)象,用于處理多個(gè) JSON 對(duì)象的數(shù)組。
3)查詢和過濾
- .: 表示當(dāng)前對(duì)象,用于訪問字段或?qū)傩浴?/li>
- .fieldName: 選擇指定字段的值。
- []: 用于遍歷數(shù)組元素。
- select(condition): 根據(jù)條件選擇元素。
- map(transform): 對(duì)數(shù)組中的每個(gè)元素應(yīng)用轉(zhuǎn)換操作。
當(dāng)使用 jq 進(jìn)行查詢和過濾 JSON 數(shù)據(jù)時(shí),你可以根據(jù)需要執(zhí)行各種操作。以下是一些常見的查詢和過濾示例,假設(shè)我們有以下 JSON 數(shù)據(jù):
[
{
"name": "Alice",
"age": 25,
"city": "New York"
},
{
"name": "Bob",
"age": 30,
"city": "Los Angeles"
},
{
"name": "Charlie",
"age": 22,
"city": "Chicago"
}
]
1、選擇字段
查詢并選擇所有人的姓名:
cat data.json | jq '.[].name'
輸出:
"Alice"
"Bob"
"Charlie"
2、過濾
選擇年齡大于 25 歲的人的姓名和城市:
cat data.json | jq '.[] | select(.age > 25) | .name, .city'
輸出:
"Bob"
"Los Angeles"
3、遍歷數(shù)組
遍歷并輸出所有人的年齡:
cat data.json | jq '.[] | .age'
輸出:
25
30
22
4、組合操作
選擇年齡在 25 到 30 歲之間的人的姓名和城市,并按照姓名排序:
cat data.json | jq '.[] | select(.age >= 25 and .age <= 30) | .name, .city' | sort
"Alice"
"New York"
"Bob"
"Los Angeles"
這些只是一些基本的查詢和過濾示例。jq 支持更多的操作和功能,你可以根據(jù)需要進(jìn)行組合和定制。請(qǐng)根據(jù)你的數(shù)據(jù)和需求來(lái)調(diào)整和擴(kuò)展這些示例。
4)修改和創(chuàng)建
- .fieldName = value: 修改字段的值。
- del(.fieldName): 刪除指定字段。
- .newField = value: 創(chuàng)建新的字段。
使用 jq 進(jìn)行 JSON 數(shù)據(jù)的修改和創(chuàng)建可以幫助你更新數(shù)據(jù)或添加新的字段。以下是一些示例,假設(shè)我們有以下 JSON 數(shù)據(jù):
{
"name": "Alice",
"age": 25,
"city": "New York"
}
1、修改字段值:
修改年齡字段的值為 26:
cat data.json | jq '.age = 26'
輸出:
{
"name": "Alice",
"age": 26,
"city": "New York"
}
2、創(chuàng)建新字段:
添加一個(gè)新的字段 country 并設(shè)置其值為 "USA":
cat data.json | jq '.country = "USA"'
輸出:
{
"name": "Alice",
"age": 25,
"city": "New York",
"country": "USA"
}
3、組合操作:
修改年齡字段的值為 26,并添加一個(gè)新的字段 country:
cat data.json | jq '.age = 26 | .country = "USA"'
輸出:
{
"name": "Alice",
"age": 26,
"city": "New York",
"country": "USA"
}
4、條件修改
如果年齡小于 30,則將城市修改為 "Chicago":
cat data.json | jq 'if .age < 30 then .city = "Chicago" else . end'
輸出(由于年齡小于 30,城市被修改):
{
"name": "Alice",
"age": 25,
"city": "Chicago"
}
這些示例演示了如何使用 jq 修改和創(chuàng)建 JSON 數(shù)據(jù)。你可以根據(jù)需要進(jìn)行組合和調(diào)整,以實(shí)現(xiàn)你的需求。記住,jq 提供了強(qiáng)大的功能,可以進(jìn)行更復(fù)雜的操作,可以根據(jù)文檔和教程進(jìn)一步學(xué)習(xí)。
5)運(yùn)算符
- +, -, *, /: 數(shù)值運(yùn)算。
- ==, !=, <, >, <=, >=: 比較運(yùn)算。
- and, or, not: 邏輯運(yùn)算。
jq 支持多種運(yùn)算符,用于在 JSON 數(shù)據(jù)中執(zhí)行數(shù)值運(yùn)算、比較和邏輯操作。以下是一些常見的 jq 運(yùn)算符示例,假設(shè)我們有以下 JSON 數(shù)據(jù):
{
"a": 10,
"b": 5,
"c": 15
}
1、數(shù)值運(yùn)算
進(jìn)行加法、減法、乘法和除法運(yùn)算:
cat data.json | jq '.a + .b'
cat data.json | jq '.a - .b'
cat data.json | jq '.a * .b'
cat data.json | jq '.a / .b'
輸出:
15
5
50
2
2、比較運(yùn)算:
比較字段值,返回布爾結(jié)果:
cat data.json | jq '.a > .b'
cat data.json | jq '.a >= .c'
cat data.json | jq '.b < .c'
輸出:
true
false
true
3、邏輯運(yùn)算:
執(zhí)行邏輯 AND、OR 和 NOT 操作:
cat data.json | jq '.a > 5 and .b < 10'
cat data.json | jq '.a > 15 or .b > 10'
cat data.json | jq 'not (.c > 20)'
輸出:
true
true
false
4、條件運(yùn)算:
使用 if 和 then 進(jìn)行條件運(yùn)算:
cat data.json | jq 'if .a > 10 then "Greater" else "Less or equal" end'
輸出:
"Less or equal"
這些示例展示了 jq 中的一些常見運(yùn)算符的用法。你可以根據(jù)需要進(jìn)行更復(fù)雜的運(yùn)算和組合操作,以實(shí)現(xiàn)你的需求。在處理 JSON 數(shù)據(jù)時(shí),jq 提供了廣泛的功能來(lái)執(zhí)行各種操作。
6)變量和條件
- as $variable: 將結(jié)果保存到變量中。
- if condition then ... else ... end: 條件語(yǔ)句。
在 jq 中,你可以使用變量和條件語(yǔ)句來(lái)處理和轉(zhuǎn)換 JSON 數(shù)據(jù)。以下是一些示例,說明如何在 jq 中使用變量和條件語(yǔ)句,假設(shè)我們有以下 JSON 數(shù)據(jù):
{
"name": "Alice",
"age": 25,
"city": "New York"
}
1、使用變量:
將字段值存儲(chǔ)到變量中,并在輸出中使用變量:
cat data.json | jq '.age as $age | "Name: \(.name), Age: \($age)"'
輸出:
"Name: Alice, Age: 25"
2、條件語(yǔ)句:
使用 if 和 then 進(jìn)行條件判斷:
cat data.json | jq 'if .age > 18 then "Adult" else "Minor" end'
輸出:
"Adult"
3、條件判斷和變量組合:
結(jié)合條件語(yǔ)句和變量,根據(jù)年齡輸出不同的消息:
cat data.json | jq 'if .age > 18 then "Name: \(.name), Status: Adult" else "Name: \(.name), Status: Minor" end'
輸出:
"Name: Alice, Status: Adult"
4、使用條件操作修改數(shù)據(jù):
根據(jù)年齡字段的值,如果大于 30 則修改城市字段:
cat data.json | jq 'if .age > 30 then .city = "Chicago" else . end'
輸出(由于年齡不大于 30,所以城市字段不變):
{
"name": "Alice",
"age": 25,
"city": "New York"
}
這些示例演示了如何在 jq 中使用變量和條件語(yǔ)句來(lái)處理 JSON 數(shù)據(jù)。你可以根據(jù)需要進(jìn)行組合和定制,以滿足你的需求。jq 提供了強(qiáng)大的功能來(lái)處理和轉(zhuǎn)換 JSON 數(shù)據(jù),可以根據(jù)文檔和教程進(jìn)一步學(xué)習(xí)。
7)函數(shù)
jq 支持一些內(nèi)置函數(shù),如 length, keys, values, tostring 等,用于操作和處理 JSON 數(shù)據(jù)。
在 jq 中,你可以使用內(nèi)置的函數(shù)來(lái)處理和轉(zhuǎn)換 JSON 數(shù)據(jù)。以下是一些常見的 jq 函數(shù)示例,假設(shè)我們有以下 JSON 數(shù)據(jù):
{
"name": "Alice",
"age": 25,
"city": "New York",
"scores": [85, 90, 78, 95]
}
1、length 函數(shù):
獲取數(shù)組的長(zhǎng)度:
cat data.json | jq '.scores | length'
輸出:
4
2、map 函數(shù):
對(duì)數(shù)組中的每個(gè)元素應(yīng)用轉(zhuǎn)換操作:
cat data.json | jq '.scores | map(. * 2)'
輸出:
[170,180,156,190]
3、keys 和 values 函數(shù):
獲取對(duì)象的鍵和值:
cat data.json | jq '. | keys'
cat data.json | jq '. | values'
輸出:
["name","age","city","scores"]
["Alice",25,"New York",[85,90,78,95]]
4、to_entries 函數(shù):
將對(duì)象轉(zhuǎn)換為鍵值對(duì)數(shù)組:
cat data.json | jq '. | to_entries'
輸出:
[
{"key":"name","value":"Alice"},
{"key":"age","value":25},
{"key":"city","value":"New York"},
{"key":"scores","value":[85,90,78,95]}
]
5、自定義函數(shù):
使用自定義函數(shù)進(jìn)行操作:
cat data.json | jq 'def average: reduce .[] as $item (0; . + $item) / length; .scores | average'
輸出:
87
這些是一些常見的 jq 命令參數(shù)和選項(xiàng),可以幫助你進(jìn)行 JSON 數(shù)據(jù)的查詢、過濾、修改和轉(zhuǎn)換。你可以通過查閱 jq 的官方文檔和教程,深入學(xué)習(xí)和掌握更多功能和用法。