jq 命令的用法

温馨提醒
  • 基本用法

    1
    2
    3
    4
    
    jq [options] [filter] [file]
    options:可选参数,用于指定 jq 的选项
    filter:必选参数,用于指定 json 数据的查询和转换操作
    file:可选参数,要处理的 json 数据文件
  • 常用选项

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    --version:输出 jq 的版本信息
    -s:读入整个输入流到一个数组
    -R:不作为 json 解析,将每一行的文本作为字符串输出到屏幕
    -n:不读取任何输入,过滤器运行使用 null 作为输入,一般用作从头构建 json 数据
    -c:使输出紧凑,而不是把每一个 json 对象输出在一行
    -C:打开颜色显示
    -M:关闭颜色显示
    -a:指定输出格式为 ASCII
    -r:如果过滤的结果是一个字符串,那么直接写到标准输出(去掉字符串的引号)

查询和过滤

.:表示当前对象,用于访问字段或属性 .fieldName:选择指定字段的值 []:用于遍历数组元素 select(condition): 根据条件选择元素 map(transform): 对数组中的每个元素应用转换操作

  •  1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    
    [
      {
        "name": "Alice",
        "age": 25,
        "city": "New York"
      },
      {
        "name": "Bob",
        "age": 30,
        "city": "Los Angeles"
      },
      {
        "name": "Charlie",
        "age": 22,
        "city": "Chicago"
      }
    ]
  • 选择字段

    1
    2
    3
    4
    5
    6
    
    # 查询并选择所有人的姓名
    cat data.json | jq '.[].name'
    
    "Alice"
    "Bob"
    "Charlie"
  • 过滤

    1
    2
    3
    4
    5
    
    # 选择年龄大于 25 岁的人的姓名和城市
    cat data.json | jq '.[] | select(.age > 25) | .name, .city'
    
    "Bob"
    "Los Angeles"
  • 遍历数组

    1
    2
    3
    4
    5
    6
    
    # 遍历并输出所有人的年龄
    cat data.json | jq '.[] | .age'
    
    25
    30
    22
  • 组合操作

    1
    2
    3
    4
    5
    6
    7
    
    # 选择年龄在 25 到 30 岁之间的人的姓名和城市,并按照姓名排序
    cat data.json | jq '.[] | select(.age >= 25 and .age <= 30) | .name, .city'
    
    "Alice"
    "New York"
    "Bob"
    "Los Angeles"

修改和创建

  • .fieldName = value: 修改字段的值。
  • del(.fieldName): 删除指定字段。
  • .newField = value: 创建新的字段
  • 1
    2
    3
    4
    5
    
    {
      "name": "Alice",
      "age": 25,
      "city": "New York"
    }
  • 修改字段的值

    1
    2
    3
    4
    5
    6
    7
    8
    
    # 修改年龄字段的值为 26
    cat data.json | jq '.age = 26'
    
    {
      "name": "Alice",
      "age": 26,
      "city": "New York"
    }
  • 创建新字段

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    # 添加一个新的字段 country 并设置其值为 "USA"
    cat data.json | jq '.country = "USA"'
    
    {
      "name": "Alice",
      "age": 25,
      "city": "New York",
      "country": "USA"
    }
  • 组合操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    # 修改年龄字段的值为 26,并添加一个新的字段 country
    cat data.json | jq '.age = 26 | .country = "USA"'
    
    {
      "name": "Alice",
      "age": 26,
      "city": "New York",
      "country": "USA"
    }
  • 条件修改

    1
    2
    3
    4
    5
    6
    7
    8
    
    # 如果年龄小于 30,则将城市修改为 "Chicago"
    cat data.json | jq 'if .age < 30 then .city = "Chicago" else . end'
    
    {
      "name": "Alice",
      "age": 25,
      "city": "Chicago"
    }

运算符

  • +, -, *, /: 数值运算。
  • ==, !=, <, >, <=, >=: 比较运算。
  • and, or, not: 逻辑运算。
  • 1
    2
    3
    4
    5
    
    {
      "a": 10,
      "b": 5,
      "c": 15
    }
  • 数值运算

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    # 进行加法、减法、乘法和除法运算
    cat data.json | jq '.a + .b'
    cat data.json | jq '.a - .b'
    cat data.json | jq '.a * .b'
    cat data.json | jq '.a / .b'
    
    15
    5
    50
    2
  • 比较运算

    1
    2
    3
    4
    5
    6
    7
    8
    
    # 比较字段值,返回布尔结果
    cat data.json | jq '.a > .b'
    cat data.json | jq '.a >= .c'
    cat data.json | jq '.b < .c'
    
    true
    false
    true
  • 逻辑运算

    1
    2
    3
    4
    5
    6
    7
    8
    
    # 执行逻辑 AND、OR 和 NOT 操作
    cat data.json | jq '.a > 5 and .b < 10'
    cat data.json | jq '.a > 15 or .b > 10'
    cat data.json | jq 'not (.c > 20)'
    
    true
    true
    false
  • 条件运算

    1
    2
    3
    4
    
    # 使用 if 和 then 进行条件运算
    cat data.json | jq 'if .a > 10 then "Greater" else "Less or equal" end'
    
    "Less or equal"

变量和条件

  • as $variable: 将结果保存到变量中。
  • if condition then … else … end: 条件语句
  • 1
    2
    3
    4
    5
    
    {
      "name": "Alice",
      "age": 25,
      "city": "New York"
    }
  • 使用变量

    1
    2
    3
    4
    
    # 将字段值存储到变量中,并在输出中使用变量
    cat data.json | jq '.age as $age | "Name: \(.name), Age: \($age)"'
    
    "Name: Alice, Age: 25"
  • 条件语句

    1
    2
    3
    4
    
    # 使用 if 和 then 进行条件判断
    cat data.json | jq 'if .age > 18 then "Adult" else "Minor" end'
    
    "Adult"
  • 条件判断和变量组合

    1
    2
    3
    4
    
    # 结合条件语句和变量,根据年龄输出不同的消息
    cat data.json | jq 'if .age > 18 then "Name: \(.name), Status: Adult" else "Name: \(.name), Status: Minor" end'
    
    "Name: Alice, Status: Adult"
  • 使用条件操作修改数据

    1
    2
    3
    4
    5
    6
    7
    8
    
    # 根据年龄字段的值,如果大于 30 则修改城市字段
    cat data.json | jq 'if .age > 30 then .city = "Chicago" else . end'
    
    {
      "name": "Alice",
      "age": 25,
      "city": "New York"
    }

函数

jq 支持一些内置函数,如 length, keys, values, tostring 等,用于操作和处理 JSON 数据

  • 1
    2
    3
    4
    5
    6
    
    {
      "name": "Alice",
      "age": 25,
      "city": "New York",
      "scores": [85, 90, 78, 95]
    }
  • length 函数

    1
    2
    3
    4
    
    # 获取数组的长度
    cat data.json | jq '.scores | length'
    
    4
  • map 函数

    1
    2
    3
    4
    
    # 对数组中的每个元素应用转换操作
    cat data.json | jq '.scores | map(. * 2)'
    
    [170,180,156,190]
  • keys 和 values 函数

    1
    2
    3
    4
    5
    6
    
    # 获取对象的键和值
    cat data.json | jq '. | keys'
    cat data.json | jq '. | values'
    
    ["name","age","city","scores"]
    ["Alice",25,"New York",[85,90,78,95]]
  • to_entries 函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    # 将对象转换为键值对数组
    cat data.json | jq '. | to_entries'
    
    [
      {"key":"name","value":"Alice"},
      {"key":"age","value":25},
      {"key":"city","value":"New York"},
      {"key":"scores","value":[85,90,78,95]}
    ]
  • 自定义函数

    1
    2
    3
    4
    
    # 使用自定义函数进行操作
    cat data.json | jq 'def average: reduce .[] as $item (0; . + $item) / length; .scores | average'
    
    87