1 | jq
|
2 | ===
|
3 |
|
4 | 一个灵活的轻量级命令行JSON处理器
|
5 |
|
6 | ### 补充说明
|
7 |
|
8 | jq 是 stedolan 开发的一个轻量级的和灵活的命令行JSON处理器,源码请参考 [jq 项目主页](https://github.com/stedolan/jq)
|
9 |
|
10 | jq 用于处理JSON输入,将给定过滤器应用于其JSON文本输入并在标准输出上将过滤器的结果生成为JSON。
|
11 |
|
12 | 最简单的过滤器是`.`,它将jq的输入未经修改地复制到其输出中(格式设置除外)。
|
13 |
|
14 | 请注意,jq 当前仅支持64位双精度浮点数(IEEE754)。
|
15 |
|
16 |
|
17 | ### 安装
|
18 |
|
19 | ```bash
|
20 | # Debian系,如 Ubuntu
|
21 | sudo apt-get install jq
|
22 |
|
23 | # RedHat系, 如 CentOS
|
24 | yum install jq
|
25 | ```
|
26 |
|
27 | ### 语法
|
28 |
|
29 | ```bash
|
30 | jq [options] <jq filter> [file...]
|
31 | jq [options] --args <jq filter> [strings...]
|
32 | jq [options] --jsonargs <jq filter> [JSON_TEXTS...]
|
33 | ```
|
34 |
|
35 | ### 选项
|
36 |
|
37 | ```bash
|
38 | -c 紧凑而不是漂亮的输出;
|
39 | -n 使用`null`作为单个输入值;
|
40 | -e 根据输出设置退出状态代码;
|
41 | -s 将所有输入读取(吸取)到数组中;应用过滤器;
|
42 | -r 输出原始字符串,而不是JSON文本;
|
43 | -R 读取原始字符串,而不是JSON文本;
|
44 | -C 为JSON着色;
|
45 | -M 单色(不要为JSON着色);
|
46 | -S 在输出上排序对象的键;
|
47 | --tab 使用制表符进行缩进;
|
48 | --arg a v 将变量$a设置为value<v>;
|
49 | --argjson a v 将变量$a设置为JSON value<v>;
|
50 | --slurpfile a f 将变量$a设置为从<f>读取的JSON文本数组;
|
51 | --rawfile a f 将变量$a设置为包含<f>内容的字符串;
|
52 | --args 其余参数是字符串参数,而不是文件;
|
53 | --jsonargs 其余的参数是JSON参数,而不是文件;
|
54 | -- 终止参数处理;
|
55 | ```
|
56 |
|
57 | ### 例子
|
58 |
|
59 | `.`: 以漂亮的方式输出
|
60 |
|
61 | ```bash
|
62 | $ echo '{ "foo": { "bar": { "baz": 123 } } }' | jq '.'
|
63 | {
|
64 | "foo": {
|
65 | "bar": {
|
66 | "baz": 123
|
67 | }
|
68 | }
|
69 | }
|
70 |
|
71 | ```
|
72 |
|
73 | `.foo, .foo.bar, .foo?`: 获取一个键的值
|
74 |
|
75 | ```bash
|
76 | $ echo '{"foo": 42, "bar": "less interesting data"}' | jq '.foo'
|
77 | 42
|
78 | ```
|
79 |
|
80 | `.[], .[]?, .[2], .[10:15]`: 数组运算
|
81 |
|
82 | ```bash
|
83 | $ echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq '.[1]'
|
84 | {
|
85 | "name": "XML",
|
86 | "good": false
|
87 | }
|
88 |
|
89 | ```
|
90 |
|
91 | `[], {}`: 构造一个数组/对象
|
92 |
|
93 | ```bash
|
94 | $ echo '{"user":"stedolan","titles":["JQ Primer", "More JQ"]}' | jq '{user, title: .titles[]}'
|
95 |
|
96 | {
|
97 | "user": "stedolan",
|
98 | "title": "JQ Primer"
|
99 | }
|
100 | {
|
101 | "user": "stedolan",
|
102 | "title": "More JQ"
|
103 | }
|
104 |
|
105 | ```
|
106 |
|
107 | `length`: 计算一个值的长度
|
108 |
|
109 | ```bash
|
110 | $ echo '[[1,2], "string", {"a":2}, null]' | jq '.[] | length'
|
111 | 2
|
112 | 6
|
113 | 1
|
114 | 0
|
115 |
|
116 | ```
|
117 |
|
118 | `keys`: 取出数组中的键
|
119 |
|
120 | ```bash
|
121 | $ echo '{"abc": 1, "abcd": 2, "Foo": 3}' | jq 'keys'
|
122 | [
|
123 | "Foo",
|
124 | "abc",
|
125 | "abcd"
|
126 | ]
|
127 |
|
128 | ```
|
129 |
|
130 | `,`: 使用多个过滤器
|
131 |
|
132 | ```bash
|
133 | $ echo '{ "foo": 42, "bar": "something else", "baz": true}' | jq '.foo, .bar'
|
134 | 42
|
135 | "something else"
|
136 |
|
137 | ```
|
138 |
|
139 | `|`: 通过管道将一个过滤器的输出当做下一个过滤器的输入
|
140 |
|
141 | ```bash
|
142 | $ echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq '.[] | .name'
|
143 | "JSON"
|
144 | "XML"
|
145 |
|
146 | ```
|
147 |
|
148 | `select(foo)`: 如果foo返回true,则输入保持不变
|
149 |
|
150 | ```bash
|
151 | $ echo '[1,5,3,0,7]' | jq 'map(select(. >= 2))'
|
152 | [
|
153 | 5,
|
154 | 3,
|
155 | 7
|
156 | ]
|
157 |
|
158 | ```
|
159 |
|
160 | `map(foo)`: 每个输入调用过滤器
|
161 |
|
162 | ```bash
|
163 | $ echo '[1,2,3]' | jq 'map(.+1)'
|
164 | [
|
165 | 2,
|
166 | 3,
|
167 | 4
|
168 | ]
|
169 |
|
170 | ```
|
171 |
|
172 | `if-then-else-end`: 条件判断
|
173 |
|
174 | ```bash
|
175 | $ echo '2' | jq 'if . == 0 then "zero" elif . == 1 then "one" else "many" end'
|
176 |
|
177 | "many"
|
178 |
|
179 | ```
|
180 |
|
181 | `\(foo)`: 在字符串中插入值并进行运算
|
182 |
|
183 | ```bash
|
184 | $ echo '42' | jq '"The input was \(.), which is one less than \(.+1)"'
|
185 |
|
186 | "The input was 42, which is one less than 43"
|
187 |
|
188 | ```
|
189 |
|
190 |
|