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