📜  jq 按键过滤 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:16:41.120000             🧑  作者: Mango

jq 按键过滤 - Shell-Bash

简介

jq是一种处理JSON数据的脚本语言,可以在命令行中使用。它可以将JSON数据流转换为易于阅读和处理的格式,也可以用于从JSON对象中提取有用的信息。

在这里,我将演示如何使用jq来按键过滤JSON对象,以及如何对其进行操作和处理。

安装

如果您使用的是基于Unix的操作系统(例如Linux或MacOS),则可以使用命令行包管理器轻松安装jq:

  • Debian/Ubuntu: sudo apt-get install jq
  • CentOS/RHEL: sudo yum install jq
  • MacOS: brew install jq

如果您使用的是Windows操作系统,可以从jq官方网站下载二进制文件 https://stedolan.github.io/jq/download/ ,并手动添加到系统 PATH 环境变量中。

过滤操作

jq的过滤操作使用类似于正则表达式的语法,使用 .、[]等符号子选项、和函数来过滤和操作JSON对象。

通过键名过滤对象数据

以下示例演示如何使用jq来按键过滤JSON对象。假设我有一个data.json文件,内容如下:

{
  "name": "John",
  "age": 30,
  "city": "New York",
  "hobbies": ["Reading", "Coding", "Hiking"],
  "car": {
    "make": "Honda",
    "model": "Civic",
    "year": 2020
  }
}

要过滤name键的值,可以使用以下命令:

$ jq '.name' data.json

该命令将返回以下输出:

"John"

如果要同时过滤多个键,可以用逗号隔开这些键:

$ jq '.name, .age, .city' data.json

该命令将返回以下输出:

"John"
30
"New York"
通过数组索引和循环过滤数组对象

如果JSON对象中包含数组,可以使用类似于数组的索引从数组对象中提取值:

以下示例演示如何使用jq来提取嵌套数组对象的值。假设我有一个data.json文件,内容如下:

{
  "employees": [
    {
      "name": "John",
      "age": 28,
      "hobbies": ["Reading", "Coding"]
    },
    {
      "name": "Kate",
      "age": 32,
      "hobbies": ["Hiking", "Skiing"]
    },
    {
      "name": "Susan",
      "age": 21,
      "hobbies": ["Traveling"]
    }
  ]
}

假设我们想提取第二个员工的爱好,可以使用以下命令:

$ jq '.employees[1].hobbies' data.json

该命令将返回以下输出:

["Hiking","Skiing"]

我们还可以使用[]和循环(forin)来过滤对象中的数组,找到特定值或其他处理。

例如,我们可以使用以下命令单独列出每个员工的爱好:

$ jq '.employees[].hobbies[]' data.json

这将返回以下输出:

"Reading"
"Coding"
"Hiking"
"Skiing"
"Traveling"
对对象进行操作与合并

在使用jq过滤JSON对象时,您可以对对象进行操作,例如删除键或更改值。以下示例演示如何使用jq来更改JSON对象中的键名称。假设我有一个data.json文件,内容如下:

{
  "name": "John",
  "age": 30,
  "city": "New York",
  "hobbies": ["Reading", "Coding", "Hiking"],
  "car": {
    "make": "Honda",
    "model": "Civic",
    "year": 2020
  }
}

要更改name键为first_name,可以使用以下命令:

$ jq '. | {first_name: .name, age: .age, city: .city, hobbies: .hobbies}' data.json

该命令将返回以下输出:

{
  "first_name": "John",
  "age": 30,
  "city": "New York",
  "hobbies": ["Reading", "Coding", "Hiking"]
}
过滤与匹配的条件

在使用jq过滤JSON对象时,可以使用条件过滤器匹配特定的值或对象属性。以下示例演示如何使用条件过滤器匹配某些值。假设我有一个data.json文件,内容如下:

{
  "employees": [
    {
      "name": "John",
      "age": 28,
      "hobbies": ["Reading", "Coding"]
    },
    {
      "name": "Kate",
      "age": 32,
      "hobbies": ["Hiking", "Skiing"]
    },
    {
      "name": "Susan",
      "age": 21,
      "hobbies": ["Traveling"]
    }
  ]
}

要查找所有年龄大于30岁的员工,请使用以下命令:

$ jq '.employees[] | select(.age > 30)' data.json

该命令将返回以下输出:

{
  "name": "Kate",
  "age": 32,
  "hobbies": ["Hiking", "Skiing"]
}
结论

在本文中,我介绍了如何使用jq按键过滤JSON对象,以及如何处理和操作过滤结果。这些技巧对于需要处理JSON数据的程序员或系统管理员特别有用。jq具有一些进阶用法和更复杂的过滤器,这里只是一个入门级别的介绍,如果你感兴趣可以从jq的官方文档入手,更加深入地了解jq的用法。