Linux JQ 命令学习笔记
? ? ??
目錄
0. Prefice(前言)
1. Filter(過濾器)? ?
2. Options(可選項)
3. Basic Filters(基礎過濾器)
4. Types And Values(數據類型和值)
5. Builtin Operators And Functions(內置運算符和函數)
6. Conditionals And Comparisons(條件和比較)
7. Advanced Features(高級特性)
8. 參考文檔:
0. Prefice(前言)
JQ是一個命令行工具,主要用于處理json文本。語法很簡單,如下:
jq [options...] filter [files...]? ? ? ? JQ可以對json文本執行多種操作,包括選擇、遍歷、刪減等等。例如?jq ′map(.price) | add′ 表示遍歷輸入的數組,并將其中每個元素的price累加起來。默認情況下,jq從stdin中讀取json數據流,多個數據流使用空格分隔。還有一些命令行參數,主要用于控制輸出和輸出的格式,filter是jq語言編寫的,主要用于操作輸入的數據。
1. Filter(過濾器)? ?
? ? ? ? filter 相當于jq程序,有很多內置的filter用于從對象中提取字段、或者將一個數字轉換為字符串或者其它的功能。
? ? ? ? filter 可以用不同的方式組合,比如可以通過管道將一個filter的輸出當做另一個filter的輸入,或者收集一個filter的輸出,存到一個數組里。有些filter能夠生成多個結果,比如枚舉出json數組中的每個元素,通過管道將元素依次傳輸給第二個filter。其它語言中通過循環和迭代實現的功能在jq中可以通過組合多個filter來實現。
2. Options(可選項)
--slurp/-s:
????????如果有多個json輸入流,默認情況下,會對每個輸入執行JQ命令,如果使用該參數,則會將所有輸入放到一個數組里,然后執行一次JQ命令。
--raw-input/-R
默認情況下,輸入必須是json格式文本,如果使用該選項,則將每行文本當做一個普通的字符串。
--null-input/-n?
將null作為輸入,該選項忽略任何輸入,僅僅將null當做輸入傳給filter。正如下面的例子,如果沒有null-input,這時候第一個參數是"one",因為沒有任何操作會被忽略,"inputs"表示剩余的輸入,因此第一個用例輸出"two, three",如果使用了null-input,這時候忽略的就是參數null,其余輸入就會被讀取到"inputs"里面,如示例三。
--compact-output / -c:
默認情況下,jq 的輸出是可讀性好的格式,如果使用該選項,則輸出則會變得緊湊。
--colour-output / -C
默認情況下,如果輸出到stdout,是有顏色的。使用該選項可以強制輸出顏色,即便是輸出到管道或者文件中。
--monochrome-output / -M
禁止輸出顏色
--ascii-output / -a:
非ASCII字符通常當做utf8字符輸出,使用該選項可以強制輸出ascii字符。
--raw-output / -r
如果輸出是一個字符串,默認情況下對包含一對雙引號,如果使用該選項,則僅僅輸出字符串文本。
--arg name value
傳遞變量到jq程序里
3. Basic Filters(基礎過濾器)
'.'
? ?. 是最基本的過濾器,對輸出不做任何處理,原樣輸出。通常用來輸出一些可讀性強的格式。
.Attr
? ?Attr是JSON對象的屬性名,這個過濾器用于打印指定key的值,如果不存在對應的key,則輸出NULL
.[]
?? ?打印數組內容,括號內可以指定索引或者指定范圍,索引從0開始。
,
?? ?可以使用逗號連接多個過濾器,這種情況下,每個過濾器分別執行,結果也會并列展示出來
|
?? ?管道符用于連接兩個過濾器,功能上類似與Unix shell 管道,左側過濾器執行結果會被當做右側過濾器的輸入,如果左側過濾器產生多個結果,則右側過濾器會分別執行。
4. Types And Values(數據類型和值)
?? ?jq支持和json一致的數據集,包括數字、字符串、布爾值、數組、對象和null
數組 []
?? ?和json一樣,[]也用于構造一個數組,數組的元素可以是任意的jq表達式,表達式的結果將會組成一個數組,可以使用[]構造任何數組。
對象·{}
?? ?和json一樣,{}用于構造對象,如果對象的key是大小寫敏感的,則雙引號可以省略,值可以是任意的jq表達式(如果是復雜的表達式,還需要使用括號括起來),可以使用這個符號從輸入中選取指定的字段。如果某個表達式生成多個結果,則對象也可能生成多個。如果key被括號括起來,則key也會被當做一個表達式。
5. Builtin Operators And Functions(內置運算符和函數)
? ? ? ? ?一些jq操作符(例如+),對根據參數的不同執行不同的操作(比如數組、數字、字符串等)。但是jq不會執行任何隱式的類型轉換,如果兩個參數類型不一致,會直接報錯。
加號 +
?? ?加號需要兩個filter,輸入會分別被過濾器執行,輸出結果會根據過濾器結果類型相加起來。
?? ?如果是數字,則按照算數相加。
?? ?如果是數組,則會拼接成一個大數組,
?? ?如果是字符串,則會拼接起來。
?? ?如果是對象,則對象會被合并,如果有相同的key,則以右側的過濾器中的key為最終結果。
?? ?如果有一個結果是null,則返回另一個結果。
減號 -?
?? ?和算術減法類似,減號也可以用在數組上,用于將數組1中所有在數組2中出現的元素刪除。
乘法*、除法 /、取余%
?? ?這些操作符只作用于數字。
length
?? ?該函數獲取不同類型值的長度。
?? ?如果是字符串,則輸出unicode代碼點數量。也可以使用utf8bytelength 輸出字符數量
?? ?如果是數組,則輸出數組元素個數
?? ?如果是對象,則輸出key-value 組的個數
?? ?如果是null,則為0
?
keys
?? ?如果輸入是個對象,則輸出一個包含該對象所有key的數組。
?? ?如果輸入是個數組,則輸出該數組合法的索引。
has
?? ?has函數返回一個對象是否有指定的key,或者一個數組在指定的索引上是否含有元素。
to_entries, from_entries, with_entries
?? ?這些函數在對象和包含key-value的數組中轉換,如果to_entries接受一個對象,則對于對象中每一個k:v,則輸出的數組中將包含{"key": k, "value": v}.
from_entries 正好做相反的事情,with_entries 等價于 to_entries|map(foo)|from_entries
select
?? ?select(filter),如果filter返回true,則結果與輸入一致,否則不輸出。
empty
?? ?empty不返回任何結果,包括null也不返回。
map(filter)
?? ?map是個遍歷操作,對輸出數組的每個元素執行filter,并將輸出放到一個數組里。等價于 '.[]|filter'
?add
?? ?add函數將輸入當做一個數組,根據數組的元素類型執行相應的操作,包括累加、字符串拼接、合并等。
?range
?? ?range函數用于生成一組連續的數字,range(4;10)產生6個數字,從4開始,直到10(10本身不包括在內)。生成的數組將作為獨立的輸出。
?tonumber
?? ?這是個類型轉換函數,該函數將輸入當做數字,如果輸入不是標準的數字形式會報錯。
tostring
?? ?同上,也是個類型轉換函數,將輸入當做字符串。
type
?? ?該函數將輸入的類型當做字符串輸出,可能是null,boolean、number、string、array、object的一種。
?sort、sort_by
?? ?這是個排序函數,輸入必須是數組類型。sort_by用于根據某一個字段來排序或者基于filter,sort_by(filter)會根據filter結果來進行排序。
group_by(.attr)
?? ?分組,類似于mysql,將輸入當做一個數組,指定一個屬性,具有相同值的會被分到同一個數組中。
?? ?
min, max, min_by, max_by
?? ?前兩個就是取最大值和最小值,后兩個可以根據指定屬性取。
unique
?? ?該函數輸入是一個數組,輸出一個不含重復元素的數組
reverse
?? ?函數用于將數組翻轉
contains(v)
?? ?如果輸入包含v,則該函數返回true。
recurse
?? ?該函數主要用于搜索遞歸類型結構數據。
字符串替換 \(x)
?? ?在一個字符串中,可以加入一個反斜杠開頭的表達式:'\express',則這個表達式的結果將會插入到字符串中。
6. Conditionals And Comparisons(條件和比較)
== , !=
?? ?表達式==只有在兩個參數完全相等時才返回true,其他情況返回FALSE,表達式!=與之相反。
if-then-else
?? ?表達式必須明確返回true或者FALSE,如果表達式返回false或者null會被當做false,如果返回0也是false.
>、>=、<=、<
?? ?這幾個比較運算符和算術比較運算符邏輯類似,結果返回true或者false
and/or/not
?? ?布爾運算符,這里值得注意的地方是如果有一個操作數生成了多個結果,則運算符會針對每個結果運算一遍。
替代運算符 //
?? ?如果一個過濾器表達式以 a//b的形式出現,如果a的結果不是false和null,則該過濾器結果為a的結果,否則為b表達式的結果。這個表達式對于提供默認值非常有用。
7. Advanced Features(高級特性)
? ? ? ? ?在其它編程語言中,變量是不可或缺的一部分。在JQ中,變量屬于一種高級特性。在大部分語言里,變量是傳遞臨時數據的唯一方式,如果你要計算一個值,并且之后在其它地方還要用到,你需要使用變量來存儲它。為了給程序的其它函數傳遞值,你需要定義一個變量(作為函數參數等)。在jq中變量很少使用,但是也是可以定義的,主要用于定義一些標準庫(很多jq函數就是這么實現的,比如map和find)。
?? ?jq還有一個reduce操作,很強大但是使用起來需要一點技巧。這個操作主要用于jq內部操作。
?? ?在jq中,我們可以使用表達式 exp as $x | .... 的方式來定義變量。對于exp生成的每一個值,都會單獨執行后續的操作,這里的as就像一個遍歷操作。
?? ?除了定義變量外,還可以使用def 語法定義函數。
?? ?reduce語法主要用于累積表達式生成的所有結果。
8. 參考文檔:
1. 官方文檔?https://stedolan.github.io/jq/manual/
2.?https://linuxcommandlibrary.com/man/jq#assignment
總結
以上是生活随笔為你收集整理的Linux JQ 命令学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win10 使用minikube搭建k8
- 下一篇: Redis 有序集合(zset)取交集(