侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux jq命令教程:如何使用jq处理JSON数据(附实例详解和注意事项)

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处理技巧。

0

评论区