Linux jq命令介绍
jq是一个免费的开源JSON处理器,它可以灵活地对JSON数据进行切片、过滤和转换。它提供了一系列强大的过滤器和函数,可以操作、分析和转换JSON数据。因为这个工具是高级的,所以在使用之前要了解jq的工作原理。
Linux jq命令适用的Linux版本
jq可以在大多数操作系统上安装,包括Linux、Windows和Mac OS X。它也可以直接下载二进制文件或从源代码构建。如果你想在Linux上使用jq,你需要安装一个包管理器,如apt、yum或brew,或者直接下载jq的二进制文件。安装后,你可以通过运行jq -version
命令来验证安装是否成功。
Linux jq命令的基本语法
jq是一个基于过滤器的JSON处理器。每个过滤器都接受一个输入,并将其输出为标准输出。我们将看到有许多预定义的过滤器,我们可以使用它们来构建和应用复杂的操作和转换。
要使用jq,你需要指定一个或多个过滤器作为参数,并将其传递给jq
命令。例如:
$ echo '{"name":"Alice","age":25}' | jq '.name'
"Alice"
这个例子中,我们首先使用echo命令输出一个简单的JSON字符串,并将其作为输入传递给jq命令。然后我们使用.
过滤器来获取输入中的某个属性值,并将其输出为标准输出。
如果你想对多个文件或字符串进行相同的操作,你可以使用管道符(|)来连接它们。例如:
$ curl [6](http://api.open-notify.org/iss-now.json) | jq '.message'
"success"
这个例子中,我们首先使用curl命令从一个API获取当前国际空间站的位置信息,并将其作为输入传递给jq命令。然后我们使用.
过滤器来获取输入中的某个属性值,并将其输出为标准输出。
Linux jq命令的常用选项或参数说明
jq有许多选项或参数可以控制它的行为和功能。下面是一些常用的选项或参数:
-r
:以纯文本格式输出结果。-s
:以简洁格式输出结果。-c
:以简洁格式输出结果,并且不包含空值。-n
:不对空值进行任何处理。-v
:显示变量名。-i
:忽略空值。-e
:执行指定的表达式。-f
:指定一个文件作为表达式来源。-p
:保留原始格式。--arg <name>=<value>
:定义一个变量并赋予其指定值。--args <string>
:定义多个变量并赋予其指定字符串值。--jsonargs <string>
:定义多个变量并赋予其JSON字符串值。
下面是一些常见技巧或高级技巧:
- 使用
.[]
来表示数组中所有元素。 - 使用
.[] | .[0] | .[1]...|.[-1]
来表示数组中所有元素按顺序排列。
Linux jq命令的实例
下面是一些jq命令的实例,你可以通过它们来学习和练习jq的功能和技巧。
实例1:输出JSON数据的格式化版本
如果你想查看一个JSON数据的格式化版本,你可以使用.
过滤器来输出整个输入。例如:
$ echo '{"name":"Alice","age":25}' | jq '.'
{
"name": "Alice",
"age": 25
}
这个例子中,我们使用echo命令输出一个简单的JSON字符串,并将其作为输入传递给jq命令。然后我们使用.
过滤器来输出整个输入,并将其格式化为易读的形式。
实例2:输出JSON数据的某个属性值
如果你想输出JSON数据的某个属性值,你可以使用.
过滤器后跟属性名来获取指定的值。例如:
$ echo '{"name":"Alice","age":25}' | jq '.name'
"Alice"
这个例子中,我们使用echo命令输出一个简单的JSON字符串,并将其作为输入传递给jq命令。然后我们使用.name
过滤器来获取输入中的name属性的值,并将其输出为标准输出。
实例3:输出JSON数据的多个属性值
如果你想输出JSON数据的多个属性值,你可以使用,
来分隔多个过滤器,并将它们包裹在[]
中。例如:
$ echo '{"name":"Alice","age":25}' | jq '[.name, .age]'
[
"Alice",
25
]
这个例子中,我们使用echo命令输出一个简单的JSON字符串,并将其作为输入传递给jq命令。然后我们使用[.name, .age]
过滤器来获取输入中的name和age属性的值,并将它们输出为一个数组。
实例4:输出JSON数据的子对象
如果你想输出JSON数据的子对象,你可以使用.
过滤器后跟子对象的路径来获取指定的对象。例如:
$ echo '{"name":"Alice","age":25,"address":{"city":"New York","country":"USA"}}' | jq '.address'
{
"city": "New York",
"country": "USA"
}
这个例子中,我们使用echo命令输出一个包含子对象的JSON字符串,并将其作为输入传递给jq命令。然后我们使用.address
过滤器来获取输入中的address属性的值,并将其输出为一个对象。
实例5:输出JSON数据的子对象的属性值
如果你想输出JSON数据的子对象的属性值,你可以使用.
过滤器后跟子对象的路径和属性名来获取指定的值。例如:
$ echo '{"name":"Alice","age":25,"address":{"city":"New York","country":"USA"}}' | jq '.address.city'
"New York"
这个例子中,我们使用echo命令输出一个包含子对象的JSON字符串,并将其作为输入传递给jq命令。然后我们使用.address.city
过滤器来获取输入中的address属性的子对象的city属性的值,并将其输出为标准输出。
实例6:输出JSON数组的所有元素
如果你想输出JSON数组的所有元素,你可以使用.[]
过滤器来表示数组中的所有元素。例如:
$ echo '[{"name":"Alice","age":25},{"name":"Bob","age":30}]' | jq '.[]'
{
"name": "Alice",
"age": 25
}
{
"name": "Bob",
"age": 30
}
这个例子中,我们使用echo命令输出一个包含两个对象的JSON数组,并将其作为输入传递给jq命令。然后我们使用.[]
过滤器来获取输入中的数组中的所有元素,并将它们输出为多个对象。
实例7:输出JSON数组的某个元素
如果你想输出JSON数组的某个元素,你可以使用.[]
过滤器后跟元素的索引来获取指定的元素。例如:
$ echo '[{"name":"Alice","age":25},{"name":"Bob","age":30}]' | jq '.[0]'
{
"name": "Alice",
"age": 25
}
这个例子中,我们使用echo命令输出一个包含两个对象的JSON数组,并将其作为输入传递给jq命令。然后我们使用.[0]
过滤器来获取输入中的数组中的第一个元素,并将其输出为一个对象。
实例8:输出JSON数组的多个元素
如果你想输出JSON数组的多个元素,你可以使用,
来分隔多个过滤器,并将它们包裹在[]
中。例如:
$ echo '[{"name":"Alice","age":25},{"name":"Bob","age":30}]' | jq '[.[0], .[1]]'
[
{
"name": "Alice",
"age": 25
},
{
"name": "Bob",
"age": 30
}
]
这个例子中,我们使用echo命令输出一个包含两个对象的JSON数组,并将其作为输入传递给jq命令。然后我们使用[.[0], .[1]]
过滤器来获取输入中的数组中的第一个和第二个元素,并将它们输出为一个数组。
实例9:输出JSON数组的最后一个元素
如果你想输出JSON数组的最后一个元素,你可以使用.[-1]
过滤器来获取指定的元素。例如:
$ echo '[{"name":"Alice","age":25},{"name":"Bob","age":30}]' | jq '.[-1]'
{
"name": "Bob",
"age": 30
}
这个例子中,我们使用echo命令输出一个包含两个对象的JSON数组,并将其作为输入传递给jq命令。然后我们使用.[-1]
过滤器来获取输入中的数组中的最后一个元素,并将其输出为一个对象。
实例10:输出JSON数组的某个范围的元素
如果你想输出JSON数组的某个范围的元素,你可以使用.[]
过滤器后跟起始索引和结束索引来获取指定的元素。例如:
$ echo '[{"name":"Alice","age":25},{"name":"Bob","age":30},{"name":"Charlie","age":35}]' | jq '.[1:3]'
[
{
"name": "Bob",
"age": 30
},
{
"name": "Charlie",
"age": 35
}
]
这个例子中,我们使用echo命令输出一个包含三个对象的JSON数组,并将其作为输入传递给jq命令。然后我们使用.[1:3]
过滤器来获取输入中的数组中的第二个到第三个元素,并将它们输出为一个数组。
实例11:输出JSON数组的某个属性值
如果你想输出JSON数组的某个属性值,你可以使用.[]
过滤器后跟属性名来获取指定的值。例如:
$ echo '[{"name":"Alice","age":25},{"name":"Bob","age":30},{"name":"Charlie","age":35}]' | jq '.[].name'
"Alice"
"Bob"
"Charlie"
这个例子中,我们使用echo命令输出一个包含三个对象的JSON数组,并将其作为输入传递给jq命令。然后我们使用.[].name
过滤器来获取输入中的数组中的所有对象的name属性的值,并将它们输出为标准输出。
实例12:输出JSON数组的多个属性值
实例12:输出JSON数组的多个属性值
如果你想输出JSON数组的多个属性值,你可以使用,
来分隔多个过滤器,并将它们包裹在[]
中。例如:
$ echo '[{"name":"Alice","age":25},{"name":"Bob","age":30}]' | jq '[.[] | .name, .age]'
[
"Alice",
25,
"Bob",
30
]
我们使用echo命令输出一个包含两个对象的JSON数组,并将其作为输入传递给jq命令。然后我们使用[.[] | .name, .age]
过滤器来获取输入中的数组中的所有对象的name和age属性,并将它们输出为一个数组。
实例13:输出JSON数组的某个属性值的数组
如果你想输出JSON数组的某个属性值的数组,你可以使用.[]
过滤器后跟属性名和|
符号来获取指定的值,并将其转换为数组。例如:
$ echo '[{"name":"Alice","age":25},{"name":"Bob","age":30},{"name":"Charlie","age":35}]' | jq '.[].name | split(" ")'
["Alice", "Bob", "Charlie"]
这个例子中,我们使用echo命令输出一个包含三个对象的JSON数组,并将其作为输入传递给jq命令。然后我们使用.[].name | split(" ")
过滤器来获取输入中的数组中的所有对象的name属性,并将其转换为一个包含字符串数组的对象。然后我们使用.
过滤器来获取这个对象中的所有字符串,并将其输出为标准输出。
实例14:输出JSON数组的某个范围内的元素
如果你想输出JSON数组的某个范围内的元素,你可以使用.[]
过滤器后跟起始索引和结束索引来获取指定的元素。例如:
$ echo '[{"name":"Alice","age":25},{"name":"Bob","age":30},{"name":"Charlie","age":35}]' | jq '.[1:3]'
[
{
"name": "Bob",
"age": 30
},
{
"name": "Charlie",
"age": 35
}
]
这个例子中,我们使用echo命令输出一个包含三个对象的JSON数组,并将其作为输入传递给jq命令。然后我们使用.[1:3]
过滤器来获取输入中的数组中从第二个到第三个元素,并将它们输出为一个数组。
实例15:输出JSON数据中指定键值对
如果你想输出JSON数据中指定键值对,你可以使用.[]
过滤器后跟键名和值名来获取指定键值对。例如:
$ echo '{"name":"Alice","age":25}' | jq '.["name"]'
"Alice"
这个例子中,我们使用echo命令输出一个简单的JSON字符串,并将其作为输入传递给jq命令。然后我们使用.["name"]
过滤器来获取输入中名为"age"键对应的值。
实例16:输出JSON数据中指定键值对的数组
如果你想输出JSON数据中指定键值对的数组,你可以使用.[]
过滤器后跟键名和值名,并将它们包裹在[]
中。例如:
$ echo '[{"name":"Alice","age":25},{"name":"Bob","age":30},{"name":"Charlie","age":35}]' | jq '[.[] | .name, .age]'
[
"Alice",
25,
"Bob",
30,
"Charlie",
35
]
这个例子中,我们使用echo命令输出一个包含三个对象的JSON数组,并将其作为输入传递给jq命令。然后我们使用[.[] | .name, .age]
过滤器来获取输入中的数组中的所有对象的name和age属性,并将它们输出为一个数组。
Linux jq命令的注意事项
在使用jq命令时,有一些注意事项需要了解:
- jq命令只能处理有效的JSON数据,如果输入的数据不是有效的JSON格式,jq命令会报错。例如:
$ echo 'name: Alice, age: 25' | jq '.'
parse error: Invalid numeric literal at line 1, column 6
这个例子中,我们使用echo命令输出一个非JSON格式的字符串,并将其作为输入传递给jq命令。然后jq命令会报错,提示无效的数字字面量。
- jq命令的过滤器是区分大小写的,如果输入的过滤器和数据中的属性名不匹配,jq命令会返回空值。例如:
$ echo '{"name":"Alice","age":25}' | jq '.NAME'
null
这个例子中,我们使用echo命令输出一个简单的JSON字符串,并将其作为输入传递给jq命令。然后我们使用.NAME
过滤器来获取输入中的NAME属性的值,但是因为输入中的属性名是name,所以jq命令会返回空值。
- jq命令的输出默认是JSON格式的,如果你想输出纯文本格式的,你可以使用
-r
选项来指定。例如:
$ echo '{"name":"Alice","age":25}' | jq -r '.name'
Alice
这个例子中,我们使用echo命令输出一个简单的JSON字符串,并将其作为输入传递给jq命令。然后我们使用-r
选项和.name
过滤器来获取输入中的name属性的值,并将其输出为纯文本格式。
- 如果你想使用jq命令处理一个本地文件中的JSON数据,你可以直接将文件名作为参数传递给jq命令,而不需要使用cat命令或重定向符号。例如:
$ jq '.name' data.json
"Alice"
这个例子中,我们直接将一个名为data.json的文件作为参数传递给jq命令。然后我们使用.name
过滤器来获取文件中的name属性的值,并将其输出为标准输出。
- 如果你在使用jq命令时遇到
bash: jq: command not found
的错误,说明你的系统中没有安装jq命令。
Linux jq命令的相关命令
下面是一些与jq命令相关的命令,你可以通过它们来学习和练习更多的JSON处理技巧。
评论区