jq处理JSON数据

功能说明:jq是一个用于处理JSON数据的命令行工具,可以解析、筛选、格式化JSON数据。与sed、awk工具类似,jq在处理JSON数据方面非常强大。

语  法:

jq [options] <jq filter> [file…]

jq [options] –args <jq filter> [strings…]

jq [options] –jsonargs <jq filter> [JSON_TEXTS…]

补充说明:jq是一个处理 JSON 输入的工具,应用给定的过滤器到其 JSON 文本输入,并将过滤器的结果作为 JSON 输出到标准输出。最简单的过滤器是.符号,它将jq的输入原封不动地复制到输出(除了格式化,注意内部使用 IEEE754 进行数字表示)。有关更高级的过滤器,请参见jq(1)手册页(“man jq”)和/或 https://stedolan.github.io/jq

          项:

-c 压缩输出,去除空白和换行符,以便生成紧凑的 JSON 格式,而非美化格式

-r 以原始格式输出,不加引号,通常用于输出字符串值

-R 读取原始字符串,而非 JSON 文本

-s 将所有输入的 JSON 对象合并为一个数组

-n 使用 `null` 作为唯一输入值。也就是不读取输入,通常与其他表达式结合使用,可以用于生成新的 JSON 对象

-e 根据输出设置退出状态码

-S 对输出的对象按键进行排序

-C 为 JSON 上色。jq默认会为输出的JSON数据上色

-M 单色(不为 JSON 上色)

–tab 使用制表符进行缩进

–arg a v 将变量 $a 设置为值<v>

–argjson a v 将shell变量 $a 设置为 JSON 值 <v>

–slurpfile a f 将shell变量 $a 设置为从 <f> 文件读取的 JSON 文本数组

–rawfile a f 将shell变量 $a 设置为由 <f> 文件的内容组成的字符串

–args 剩余参数是字符串参数,而非文件

–jsonargs 剩余参数是 JSON 参数,而非文件

— 终止参数处理

其中,命名参数也可以作为 $ARGS.named[] 使用,而位置参数可以作为 $ARGS.positional[] 使用。

   数:

file… 一个或多个文件

strings… 一个或多个字符串

JSON_TEXTS… 一个或多个JSON字符串

器:

. 表示当前输入的 JSON 对象,可以用来访问字段

[] 用于访问数组中的元素

| 用于将前一个表达式的输出作为下一个表达式的输入

{} 用于创建新的 JSON 对象

[] | .field 用于遍历数组并提取特定字段

运算符和内建函数:

+,-

*,/,%

>, >=, <=, <

and, or, not

==,!=

in

abs

length

utf8bytelength

has(key)

map(f), map_values(f)

path(path_expression)

del(path_expression)

select(boolean_expression)

add

any

all

bsearch(x)

repeat(exp)

while(cond; update)

indices(s)

index(s), rindex(s)

contains(element)

unique, unique_by(path_exp)

min, max, min_by(path_exp), max_by(path_exp)

flatten, flatten(depth)

字符串相关函数

join(str)

split(str)

implode

explode

rtrimstr(str)

ltrimstr(str)

endswith(str)

startswith(str)

reverse

正则表达式相关函数

test(val), test(regex; flags)

match(val), match(regex; flags)

capture(val), capture(regex; flags)

sub(regex; tostring), sub(regex; tostring; flags)

splits(regex), splits(regex; flags)

split(regex; flags)

scan(regex), scan(regex; flags)

gsub(regex; tostring), gsub(regex; tostring; flags)

数学相关函数

sqrt

range(upto), range(from; upto), range(from; upto; by)

floor

更多参考官方文档https://jqlang.github.io/jq/manual/#builtin-operators-and-functions

流程控制语句:

if A then B else C end

try-catch

break

   例:

1 简单的实例

压缩输出,去除空白和换行符,以便生成紧凑的 JSON 格式:

echo ‘{“name”: “Alice”, “age”: 30}’ | jq -c .

输出:{“name”:”Alice”,”age”:30}

以原始格式输出,不加引号,通常用于输出字符串值:

echo ‘{“name”: “Alice”, “age”: 30}’ | jq -r .name

输出:Alice

将所有输入的 JSON 对象合并为一个数组:

$ echo ‘{“name”: “Alice”, “age”: 30}{“name”: “Bob”, “age”: 25}{“name”: “Charlie”, “age”: 35}’ | jq -s .

输出:

[

  {

    “name”: “Alice”,

    “age”: 30

  },

  {

    “name”: “Bob”,

    “age”: 25

  },

  {

    “name”: “Charlie”,

    “age”: 35

  }

]

将 shell 变量传递给 jq 作为变量

name=”Alice”

echo ‘{}’ | jq –arg name “$name” ‘{name: $name}’

输出:{“name”:”Alice”}

2 过滤器实例

[] 用于访问JSON数组中的元素

echo ‘[{“name”: “Alice”}, {“name”: “Bob”}, {“name”: “Charlie”}]’ | jq ‘.[1]’

输出:

{

  “name”: “Bob”

}

在这个例子中,.[1] 访问数组中的第二个元素(索引从0开始)。

{}用于创建新的JSON对象,可以根据需要定义键值对

jq -n ‘{name: “Alice”, age: 30}’

输出:

{

  “name”: “Alice”,

  “age”: 30

}

这里使用 -n 选项表示不读取输入,而是直接创建一个新的 JSON 对象。

[] | .field用于遍历一个数组并提取每个对象中的特定字段

echo ‘[{“name”: “Alice”}, {“name”: “Bob”}, {“name”: “Charlie”}]’ | jq ‘.[].name’

输出:

“Alice”

“Bob”

“Charlie”

在这个例子中,[].name 遍历数组中的每个对象,提取 name 字段的值。

3 运算符、流程控制语句和内置函数实例

echo ‘[{“name”: “Alice”, “age”: 30}, {“name”: “Bob”, “age”: 25}, {“name”: “Charlie”, “age”: 35}]’ | jq ‘map(if .name==”Alice” then “yes” else “no” end)’

输出:

[

  “yes”,

  “no”,

  “no”

]

4 jq脚本实例

你可以将复杂的 jq 脚本写入一个 .jq 文件,然后在命令行中引用该文件。步骤如下。首先,创建一个名为 script.jq 的文件,并将你的 jq 脚本写入其中:

# script.jq

map(select(.age > 28) | {name: .name, status: (if .age < 35 then “年轻” else “成熟” end)})

然后在命令行中使用 jq 运行这个脚本:

echo ‘[{“name”: “Alice”, “age”: 30}, {“name”: “Bob”, “age”: 25}, {“name”: “Charlie”, “age”: 35}]’ | jq -f script.jq

输出:

[

  {

    “name”: “Alice”,

    “status”: “年轻”

  },

  {

    “name”: “Charlie”,

    “status”: “成熟”

  }

]

也可以把JSON数据放到一个文件中,再运行jq脚本来过滤它,例如:

$ echo ‘[{“name”: “Alice”, “age”: 30}, {“name”: “Bob”, “age”: 25}, {“name”: “Charlie”, “age”: 35}]’>input.json

$ jq -f script.jq input.json

输出:

[

  {

    “name”: “Alice”,

    “status”: “年轻”

  },

  {

    “name”: “Charlie”,

    “status”: “成熟”

  }

]

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注