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