Linux——jq命令详解


整体说明

  • jq 是 Linux 下轻量、强大的命令行 JSON 处理器
  • 包含功能:
    • JSON 数据的解析、过滤、转换、格式化与流式处理
  • 是平时工作时,日志查看抽取,Json 字段修改,构造新的 Json 等常用的工具

jq 基本语法

  • 从文件读取:

    1
    jq [参数] 'filter_statement' [json_file_name]
    • 参数 用于指定输出形式等
    • 'filter_statement' 表示过滤器表达式,可以用于访问 Json 对象内部的字段
    • json_file_name 表示 Json 文件名
  • 或从标准输入读取

    1
    2
    cat data.json | jq 'filter_statement'
    echo '{"key":"value"}' | jq 'filter_statement'

jq 常用参数:

  • -c/--compact-output
    • 单行显示 JSON(紧凑输出,不做美化),常用于压缩过长的输出(注:输出是有颜色的,所以相比普通的纯文本会更易读取)
  • -r/--raw-output
    • 输出原始字符串,自动去除 JSON 引号,主要适合脚本直接使用文本内容
  • -C
    • 启用彩色高亮输出(当前默认终端都启用这个参数的)

jq 常用过滤器

基础访问语法

  • .:输出整个输入 JSON,用于格式化美化
    • 示例:echo '{"name":"Alice"}' | jq '.'
    • 注:
      • 省略过滤器时默认跟 . 效果一致
      • 使用是记得加双引号
  • .字段名:提取对象字段值
    • 嵌套时可用 .父字段.子字段 链式访问
    • 示例:echo '{"user":{"name":"Bob"}}' | jq '.user.name'
  • .字段名?
    • 安全访问字段,字段不存在时返回 null,不报错
  • .[索引]
    • 访问数组元素,索引从 0 开始
    • .[起始:] 取切片
    • .[起始:结束] 取区间
    • 示例:echo '["a","b","c"]' | jq '.[1]'(取第二个元素)
  • .[]
    • 迭代数组/对象所有元素,展开为独立输出
    • 示例:echo '["x","y"]' | jq '.[]'(每行输出一个元素)
  • .[]?
    • 安全迭代,空数组/对象时不报错

jq 管道与组合

  • |

    • 管道符,可将前一个过滤器的输出作为后一个的输入
    • 示例:echo '{"users":[{"name":"A"},{"name":"B"}]}' | jq '.users[] | .name'
      • 输出为两行
        1
        2
        "A"
        "B"
  • ,

    • 多表达式组合,依次执行并输出多个结果
    • 示例:echo '{"a":1,"b":2}' | jq '.a, .b'
      • 输出为两行
        1
        2
        1
        2
  • A // B

    • 空值合并,Anull 或 空时,取 B
    • 示例:echo '{"name":null}' | jq '.name // "Unknown"'

jq 常用内置函数

  • keys:获取对象的键名列表,或数组的索引列表

    • 示例:echo '{"x":1,"y":2}' | jq 'keys'
      • 输出:
        1
        2
        3
        4
        [
        "x",
        "y"
        ]
  • length:返回数组长度、字符串长度或对象键的数量

    • 示例:echo '{"name":null}' | jq 'length'
      • 输出
        1
        1
  • map(过滤器):对数组每个元素应用过滤器,返回新数组

    • 示例:echo '[1,2,3]' | jq 'map(. * 2)'(每个元素的值翻倍)
      • 输出:
        1
        2
        3
        4
        5
        [
        2,
        4,
        6
        ]
  • select(条件):按条件过滤元素,保留满足条件的结果

    • 示例:echo '[{"age":20},{"age":30}]' | jq '.[] | select(.age > 25)'
      • 输出:
        1
        2
        3
        {
        "age": 30
        }
  • sort_by(字段):按指定字段对数组排序

    • 示例:echo '[{"age":30},{"age":20}]' | jq 'sort_by(.age)'
      • 输出:
        1
        2
        3
        4
        5
        6
        7
        8
        [
        {
        "age": 20
        },
        {
        "age": 30
        }
        ]

jq 的一些常用用法示例

  • 构造新 JSON

    1
    2
    3
    # 提取指定字段并重组
    echo '{"name":"Alice","age":30,"city":"Beijing"}' | jq '{userName:.name, userAge:.age}'
    # 输出:{"userName":"Alice","userAge":30}
  • 条件判断与修改

    1
    2
    # 年龄大于25则标记为成年
    echo '[{"name":"A","age":20},{"name":"B","age":30}]' | jq '.[] | . + {adult:(.age > 25)}'