linux jq json处理实践

248 阅读2分钟
1.格式化后原样输出,身份运算符: '.'
# echo '{ "foo": { "bar": { "baz": 123 } } }' |jq  '.'
{
  "foo": {
    "bar": {
      "baz": 123
    }
  }
}
2. 获取key的值:'.key-name'
# echo '{"foo": 42, "bar": "less interesting data"}'|jq '.foo'
42
3.多次操作输入: ','
# echo '{ "foo": 42, "bar": "something else", "baz": true}'|jq '.foo, .bar'
42
"something else"

4.操作数组:.[] 、.[]? 、.[1] 、.[10:15]
# echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' |jq '.[1]'
{
  "name": "XML",
  "good": false
}
# .[]? 用于如果输入的不是数组[]或对象{} 它不会输出错误
# echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' |jq '.[]?'
{
  "name": "JSON",
  "good": true
}
{
  "name": "XML",
  "good": false
}

# 返回数组的所有元素,并且每个值是单独的结果。也可以在对象上使用它,它将返回对象的所有值
# echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' |jq '.[]'
{
  "name": "JSON",
  "good": true
}
{
  "name": "XML",
  "good": false
}

# echo '{"a": 1, "b": 1,"c":2}'|jq '.[]'
1
1
2


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

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

5.使用管道连接过滤器:'.[]|.name'
# 管道 | 连接前一个过滤器的输出变为后一个过滤器的输入
# echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]'|jq '.[]|.name'
"JSON"
"XML"

6. 为每个输入值都调用过滤器:map(foo)
#array里面的每个值都+1
#echo '[1,2,3]'|jq 'map(.+1)'
[
  2,
  3,
  4
]

7. 过滤器 select(boolean_expression) 当表达式为真才输出对应的值
# echo '[1,5,3,0,7]'|jq 'map(select(.>2))'
[
  5,
  3,
  7
]

# echo '[{"id": "first", "val": 1}, {"id": "second", "val": 2}]'|jq '.[] | select(.id == "second")'
{
  "id": "second",
  "val": 2
}

8. 构造数组或对象:[] 、{}
#数组
# echo '{"user":"stedolan", "projects": ["jq", "wikiflow"]}'|jq '[.user, .projects[]]'
[
  "stedolan",
  "jq",
  "wikiflow"
]

#对象 {}
#()作为表达式有先运算的优先级 
# echo '{"user":"stedolan", "projects": ["jq", "wikiflow"]}'|jq '{(.user):.projects}'
{
  "stedolan": [
    "jq",
    "wikiflow"
  ]
}


# echo '{"user":"stedolan", "projects": ["jq", "wikiflow"]}'|jq '{user,projects:.projects}'
{
  "user": "stedolan",
  "projects": [
    "jq",
    "wikiflow"
  ]
}

# echo '{"user":"stedolan", "projects": ["jq", "wikiflow"]}'|jq '{user,projects}'
{
  "user": "stedolan",
  "projects": [
    "jq",
    "wikiflow"
  ]
}

# echo '{"user":"stedolan", "projects": ["jq", "wikiflow"]}'|jq '{user,projects:.projects[]}'
{
  "user": "stedolan",
  "projects": "jq"
}
{
  "user": "stedolan",
  "projects": "wikiflow"
}

# echo '{"user":"stedolan", "projects": ["jq", "wikiflow"]}'|jq '{aaa:.user,bbb:.projects}'
{
  "aaa": "stedolan",
  "bbb": [
    "jq",
    "wikiflow"
  ]
}

# echo '{"user":"stedolan", "projects": ["jq", "wikiflow"]}'|jq '{aaa:.user}'
{
  "aaa": "stedolan"
}

9. 获取值(对象,数组,字符等)的长度 length
# echo '[[1,2], "string", {"a":2}, null]'|jq '.[] | length'
2
6
1
0

# echo '{"user":"stedolan", "projects": ["jq", "wikiflow"]}'|jq 'length'
2


10 . 获取key名称 keys
# echo '{"abc": 1, "abcd": 2, "Foo": 3}'|jq 'keys'
[
  "Foo",
  "abc",
  "abcd"
]
#按unicode代码点顺序, “按字母顺序”排序
# echo '{"abc": 1, "abcd": 2, "Foo": 3}'|jq 'keys[0]'
"Foo"

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

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

11. 条件判断 if-then-else-end
# echo 2 |jq 'if . == 0 then "zero" elif . == 1 then "one" else "many" end'

"many"

# echo '{"a":1,"b":2}' | jq 'if .|length == 0 then "zero" elif .|length == 1 then "one" elif .|length == 2 then "two" else "other" end'

"two"



12. 在字符串里插入值: \(foo)
# echo 42  | jq '"The input was \(.), which is one less than \(.+1)"'

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

13. 判断类型: type
# echo  '[0, false, [], {}, null, "hello"]'|jq 'map(type)'
[
  "number",
  "boolean",
  "array",
  "object",
  "null",
  "string"
]