## 入门

### 介绍

jq 就像用于 JSON 数据的 sed - 您可以使用它来切片、过滤、映射和转换结构化数据

- jq 官网 (stedolan.github.io)
- jq 命令使用 (jaywcjlove.github.io)

安装

    $ sudo apt-get install jq # Debian& Ubuntu
    $ sudo dnf install jq     # Fedora
    $ sudo zypper install jq  # openSUSE
    $ sudo pacman -S jq    # Arch
    $ brew install jq      # macOS & Homebrew
    $ port install jq      # macOS & MacPorts

语法

    $ jq [options] <jq filter> [file...]
    $ jq [options] --args <jq filter> [strings...]
    $ jq [options] --jsonargs <jq filter> [JSON_TEXTS...]

### 选项

:- | -
--- | ---
`-c` | 紧凑而不是漂亮的输出
`-n` | 使用`null`作为单个输入值
`-e` | 根据输出设置退出状态代码
`-s` | 将所有输入读取（吸取）到数组中；应用过滤器
`-r` | 输出原始字符串，而不是JSON文本
`-R` | 读取原始字符串，而不是JSON文本
`-C` | 为 JSON 着色
`-M` | 单色（不要为JSON着色）
`-S` | 在输出上排序对象的键
`--tab` | 使用制表符进行缩进
`--arg a v` | 将变量 `$a` 设置为 value `<v>`
`--argjson a v` | 将变量 `$a` 设置为 JSON value `<v>`
`--slurpfile a f` | 将变量 `$a` 设置为从`<f>`读取的JSON文本数组
`--rawfile a f` | 将变量 `$a` 设置为包含`<f>`内容的字符串
`--args` | 其余参数是字符串参数，而不是文件
`--jsonargs` | 其余的参数是JSON参数，而不是文件
`--` | 终止参数处理

## 学习示例

### 获取一个键的值

    $ echo '{"foo": 42, "bar": "less interesting data"}' | jq '.foo'

输出结果

    42

### 数组运算

    $ echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq '.[1]'

输出结果

    {
      "name": "XML",
      "good": false
    }

### 构造一个数组/对象

    $ echo '{"user":"stedolan","titles":["JQ Primer", "More JQ"]}' | jq '{user, title: .titles[]}'

输出结果

    {
      "user": "stedolan",
      "title": "JQ Primer"
    }
    {
      "user": "stedolan",
      "title": "More JQ"
    }

### 计算一个值的长度

    $ echo '[[1,2], "string", {"a":2}, null]' | jq '.[] | length'

输出结果

    2
    6
    1
    0

### 取出数组中的键

    $ echo '{"abc": 1, "abcd": 2, "Foo": 3}' | jq 'keys'

输出结果

    [
      "Foo",
      "abc",
      "abcd"
    ]

### 使用多个过滤器

    $ echo '{ "foo": 42, "bar": "something else", "baz": true}' | jq '.foo, .bar'

输出结果

    42
    "something else"

### 管道传递给下一个过滤器

    $ echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq '.[] | .name'

输出结果

    "JSON"
    "XML"

### 条件语句判断

    $ echo '[1,5,3,0,7]' | jq 'map(select(. >= 2))'

输出结果

    [
      5,
      3,
      7
    ]

### 每个输入调用过滤器

    $ echo '[1,2,3]' | jq 'map(.+1)'

输出结果

    [
      2,
      3,
      4
    ]

### 条件判断

    $ echo '2' | jq 'if . == 0 then "zero" elif . == 1 then "one" else "many" end'

输出结果

    "many"

### 字符串插入值并进行运算

    $ echo '42' | jq '"The input was \(.), which is one less than \(.+1)"'

输出结果

    "The input was 42, which is one less than 43"

## 另见

- jq 官网 (stedolan.github.io)
- jq 命令使用 (jaywcjlove.github.io)