jq: Command-line Tool for Handling JSON Data

Overview
jq is a command-line utility for processing JSON data, similar in functionality to sed and awk but specifically designed for JSON, making it extremely powerful for parsing, filtering, and formatting JSON data.

Usage

jq [options] <jq filter> [file...]
jq [options] --args <jq filter> [strings...]
jq [options] --jsonargs <jq filter> [JSON_TEXTS...]

Description
jq processes JSON input by applying specified filters to JSON text, outputting the result in JSON format to standard output. The simplest filter is . (dot), which outputs the JSON input as-is (with formatting adjustments and IEEE 754 numeric representation). For more complex filters, refer to the jq(1) manual or jq’s official documentation.

Options

  • -c: Compresses output, removing whitespace and newlines to produce compact JSON.
  • -r: Outputs raw format without quotes, useful for string values.
  • -R: Reads raw strings instead of JSON text.
  • -s: Slurps all input JSON objects into a single array.
  • -n: Uses null as the input, often used to create new JSON objects without reading input.
  • -e: Sets exit status based on output.
  • -S: Sorts keys in output JSON objects.
  • -C: Colors JSON output (enabled by default).
  • -M: Monochrome mode, disables JSON coloring.
  • --tab: Indents using tabs.
  • --arg a v: Sets $a to value <v>.
  • --argjson a v: Sets shell variable $a to JSON value <v>.
  • --slurpfile a f: Sets $a as an array from JSON data in file <f>.
  • --rawfile a f: Sets $a to the raw content of file <f>.
  • --args: Treats remaining arguments as string parameters, not files.
  • --jsonargs: Treats remaining arguments as JSON parameters.
  • --: Stops processing options.

Arguments can also be accessed using $ARGS.named[] for named parameters or $ARGS.positional[] for positional parameters.

Parameters

  • file...: One or more files.
  • strings...: One or more strings.
  • JSON_TEXTS...: One or more JSON strings.

Filters

  • .: Refers to the current JSON object, used to access fields.
  • []: Accesses elements in an array.
  • |: Passes output from one expression as input to the next.
  • {}: Creates a new JSON object.
  • [] | .field: Traverses an array and extracts specific fields from each object.

Operators and Built-in Functions
Includes common operators (+, -, *, /, %) and functions like length, has, map, select, unique, min, and max. String functions include split, join, startswith, and endswith. Regex and mathematical functions are also available, such as test, match, sqrt, and range.

Examples

1 Basic Examples

Compact JSON output by removing whitespace and newlines:

echo '{"name": "Alice", "age": 30}' | jq -c .

Output:
{"name":"Alice","age":30}

Raw output without quotes, typically for string values:

echo '{"name": "Alice", "age": 30}' | jq -r .name

Output:
Alice

Combine all input JSON objects into an array:

$ echo '{"name": "Alice", "age": 30}{"name": "Bob", "age": 25}{"name": "Charlie", "age": 35}' | jq -s .

Output:

[
  { "name": "Alice", "age": 30 },
  { "name": "Bob", "age": 25 },
  { "name": "Charlie", "age": 35 }
]

Passing shell variables to jq as JSON variables:

name="Alice"
echo '{}' | jq --arg name "$name" '{name: $name}'

Output:
{ "name": "Alice" }

2 Filter Examples

Access an element in a JSON array:

echo '[{"name": "Alice"}, {"name": "Bob"}, {"name": "Charlie"}]' | jq '.[1]'

Output:

{ "name": "Bob" }

Create a new JSON object with defined key-value pairs:

jq -n '{name: "Alice", age: 30}'

Output:

{ "name": "Alice", "age": 30 }

Traverse an array and extract a specific field from each object:

echo '[{"name": "Alice"}, {"name": "Bob"}, {"name": "Charlie"}]' | jq '.[].name'

Output:

"Alice"
"Bob"
"Charlie"

3 Operators, Control Statements, and Built-in Functions

Use conditional expressions to modify output:

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

Output:

[ "yes", "no", "no" ]

4 jq Scripts

Save complex jq commands in a .jq file and execute them:

Create a file script.jq with:

map(select(.age > 28) | {name: .name, status: (if .age < 35 then "young" else "mature" end)})

Run the script:

echo '[{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}, {"name": "Charlie", "age": 35}]' | jq -f script.jq

Output:

[
  { "name": "Alice", "status": "young" },
  { "name": "Charlie", "status": "mature" }
]

Alternatively, save JSON data to a file and filter it:

$ echo '[{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}, {"name": "Charlie", "age": 35}]'>input.json
$ jq -f script.jq input.json

Output:

[
  { "name": "Alice", "status": "young" },
  { "name": "Charlie", "status": "mature" }
]

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”: “成熟”

  }

]