jq常用操作

1.简介

    jq 是一款非常强大的 JSON 命令行处理工具。其官网地址为:https://stedolan.github.io/jq/

2.安装

    以CentOS为例:

1.在线安装

yum install -y epel-release && yum install -y jq

2.离线安装

  • 访问官网,并下载jq(Linux 64-bit)
  • 在Linux中执行命令
mv -f /home/surpass/jq-linux64 /usr/bin/jq

3.验证安装

# jq -h
Some of the options include:
  -c               compact instead of pretty-printed output;
  -n               use `null` as the single input value;
  -e               set the exit status code based on the output;
  -s               read (slurp) all inputs into an array; apply filter to it;
  -r               output raw strings, not JSON texts;
  -R               read raw strings, not JSON texts;
  -C               colorize JSON;
  -M               monochrome (don't colorize JSON);
  -S               sort keys of objects on output;
  --tab            use tabs for indentation;
  --arg a v        set variable $a to value <v>;
  --argjson a v    set variable $a to JSON value <v>;
  --slurpfile a f  set variable $a to an array of JSON texts read from <f>;
  --rawfile a f    set variable $a to a string consisting of the contents of <f>;
  --args           remaining arguments are string arguments, not files;
  --jsonargs       remaining arguments are JSON arguments, not files;
  --               terminates argument processing;

3.常用参数

  • -h/--help

输出jq帮助信息

  • -V/--version

输出jq版本信息

  • -c/--compact-output

将每个JSON对象在单行内以紧凑的形式输出

  • -n/--null-input

不读取任何输入,将null做为输入运行一次

  • -r/--raw-output

在开启这个选项的情况下,如果 过滤器 的结果是 string,就会直接写入标准输出而不是以 JSON string 的格式输出。这在 jq 过滤器和其他处理 非-JSON 系统交互时比较有用。

  • -R/--raw-input

不要将输入解析为JSON。相反,每行文本都以字符串形式传递给过滤器

  • -C/--color-output和-M/--monochrome-output

默认情况下,如果是写入到终端,jq 会输出 colored JSON 。也可以使用 -C 强制输出彩色的JSON 到管道或者文件。也可以使用 -M 禁掉输出 colored JSON 。

  • -S/--sort-keys

将每个 JSON object 的各个字段按照 key 排序的顺序输出

  • --tab

使用tab符做为缩进符

  • --indent n

指定缩进使用的空格数,范围为[-1,7]

4.基本过滤器

    在使用过滤器前,先来看看一个示例数据,如下所示:

{
  "personInfo": {
    "name": "Surpass",
    "age": 28,
    "location": "shanghai"
  },
  "others": [
    "a",
    "b",
    "c"
  ]
}
  • 1、.

    最简单也是最平常的过滤器,其作用是接收输入并原样输出的过滤器

cat test.json | jq .
{
  "personInfo": {
    "name": "Surpass",
    "age": 28,
    "location": "shanghai"
  },
  "others": [
    "a",
    "b",
    "c"
  ]
}
  • 2、.key.key.key'.["key"]'

    获取指定key的值,如果没有找到指定的key,则输出null

# cat test.json | jq .personInfo
{
  "name": "Surpass",
  "age": 28,
  "location": "shanghai"
}

# cat test.json | jq .personInfo.name
"Surpass"

# cat test.json | jq '.["personInfo"]'
{
  "name": "Surpass",
  "age": 28,
  "location": "shanghai"
}
# cat test.json | jq .abc
null
  • 3、.key?

    使用 .key 时,当 . 不是一个数组或对象时会而报错,使用 .key? 则不会报错

# echo "1" | jq .a
jq: error (at <stdin>:1): Cannot index number with string "a"
# echo "1" | jq .a?
# 
  • 4、.[index].[startIndex:endIndex]

    获取对象或value为数组或字符串的子数组或子符串。索引主要有以下几种形式

  • 索引下标从0开始,
  • 支持负索引,-1表示最后一个元素,-2表示倒数第二个元素
# cat test.json | jq .others[0]
"a"
# cat test.json | jq .others[1:3]
[
  "b",
  "c"
]
# cat test.json | jq .others[-3:-1]
[
  "a",
  "b"
]
# cat test.json | jq .others[:3]
[
  "a",
  "b",
  "c"
]
# echo '[{"name":"Surpass","age":28},{"oters":1234}]' | jq .[0]
{
  "name": "Surpass",
  "age": 28
}
# echo '["Surpass"]' | jq .[0][0:3]
"Sur"
  • 5、.[]

    获取所有的value值

# cat test.json | jq .[]
{
  "name": "Surpass",
  "age": 28,
  "location": "shanghai"
}
[
  "a",
  "b",
  "c"
]
  • 6、keys

    获取所有的key对象

# cat test.json | jq keys
[
  "others",
  "personInfo"
]
  • 7、[.[]]

    获取所有value组成的数组

cat test.json | jq [.[]]
[
  {
    "name": "Surpass",
    "age": 28,
    "location": "shanghai"
  },
  [
    "a",
    "b",
    "c"
  ]
]

  • 8、.[].key

    获取数组元素中指定key的所有值

# echo '[{"name":"Surpass"},{"name":"Kevin"},{"name":"Tina"}]' | jq .[].name
"Surpass"
"Kevin"
"Tina"

如果需要将输出结果再次组装为数组,可以这样使用 [.[].key]

  • 9、,

    使用多个筛选条件

# cat test.json | jq .personInfo | jq [.name,.age]
[
  "Surpass",
  28
]
  • 10、管道

    可以通过 | 实现管道功能,从而达到对处理的结果进行二次或多次处理

# cat test.json | jq '.personInfo|.name,.age'
"Surpass"
28
# cat test.json | jq '.others|.[2]'
"c"

也可以使用Linux自带的 | 实现同样的功能。

  • 11、length

    length 可以获取字符串或数组的长度

# cat test.json | jq '.others|length'
3
# cat test.json | jq '.personInfo|length'
3
# cat test.json | jq '.personInfo|.name|length'
7
  • 12、map

    可以实现对数组的每一项操作,然后进行合并结果。

# echo '["Surpass","Kevin","Tina"]' | jq 'map(length)'
[
  7,
  5,
  4
]
  • 13、filter(select)

    可以实现对输入项进行判断,然后仅返回符合条件的项

# echo '["Surpass","Kevin","Tina"]' | jq 'map(select(.|length>5))'
[
  "Surpass"
]
# echo '["Surpass","Kevin","Tina"]' | jq 'map(select(.|length>=5))'
[
  "Surpass",
  "Kevin"
]
  • 14、\()

    可以实现字符串插值功能

# cat test.json | jq '"Hello \(.personInfo|.name)"'
"Hello Surpass"
# echo '{"name":"Surpass","age":28}' | jq '"age is: \(.age)"'
"age is: 28"
  • 15、+

    可以实现字符串拼接功能

# echo '{"name":"Surpass","age":28}' | jq '"name is :" + .name'
"name is :Surpass"
cat test.json | jq '"name is :" + .personInfo.name '
"name is :Surpass"
  • 16、if/elif/else

    可以使用 if .. then .. elif .. then .. else .. end 实现条件判断

# echo '[0, 1, 2, 3]' \
> | jq 'map(if . == 0 then "zero" elif . == 1 then "one" elif . == 2 then "two" else "many" end)'
[
  "zero",
  "one",
  "two",
  "many"
]
  • 17、构造 object 或数组

    可以通过 {} 和 [] 构造新的 object 或 数组

  • object:
# echo '["Surpass","Kevin","Tina"]' | jq '{name:.[0]}'
{
  "name": "Surpass"
}

# echo '{"name":"Surpass","ages":[28,29,30]}' | jq '{name,age: .ages[]}'
{
  "name": "Surpass",
  "age": 28
}
{
  "name": "Surpass",
  "age": 29
}
{
  "name": "Surpass",
  "age": 30
}
  • array
# echo '{"name":"Surpass","age":28,"location":"Shanghai"}' | jq '[.name,.age,.location]'
[
  "Surpass",
  28,
  "Shanghai"
]
  • 18、join

    可以进行数组拼接功能。

# echo '["Surpass","28","Shanghai"]' | jq '.|join("--")'
"Surpass--28--Shanghai"
  • 19、split

    可对字符串进行拆分

# echo '"Surpass--28--Shanghai"' | jq 'split("--")'
[
  "Surpass",
  "28",
  "Shanghai"
]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容

  • jquery介绍 jQuery是目前使用最广泛的javascript函数库 据统计,全世界排名前100万的网站,有...
    就是这么帅_567e阅读 937评论 0 0
  • jq 命令介绍 简介 jq 是一款命令行下处理 JSON 数据的工具。其可以接受标准输入,命令管道或者文件中的 J...
    mini鱼阅读 5,299评论 0 2
  • 1、JSP: jsp和servlet的区别 jsp本质就是Servlet,jsp的工作原理是:JSP页面在执行的时...
    小雨同志贰2岁阅读 874评论 1 3
  • angular有哪些牛逼特性呢? 1、模板机制2、双向数据绑定3、模块4、指令5、依赖注入6、路由7、过滤器 An...
    Man僵小鱼阅读 1,089评论 0 6
  • vue面试题 一、vue优点 1.轻量级框架:只关注视图层,是一个构建数据的视图集合,大小只有几十kb; 2.简单...
    没糖_cristalle阅读 1,589评论 0 3