目录

Linux jq 使用

jq 是一个很好用的处理 json 的工具,可以使用它直接在命令行下对 json 进行操作,分片、过滤、映射和转换。

安装

# ubuntu安装
apt-get update
apt-get install jq

# 编译安装
git clone https://github.com/stedolan/jq.git
cd jq
autoreconf -i
./configure --disable-maintainer-mode
make
sudo make install

简单使用

格式化输出

test.json 文件的内容:

[{"name":"xiaoming","age":"18","address":{"city":"上海","country":"中国"},"contacts":[{"phone":"132156465"}]}]

格式化输出:

cat test.json | jq '.'
# 或者
jq '.' test.json

输出:

[
  {
    "name":"xiaoming",
 "age":"18",
 "address":{
   "city":"上海",
   "country":"中国"
 },
 "contacts": [
   {
     "phone":"132156465"
   }
 ]
  }
]

访问 json 对象的属性

访问元素的操作: .<attributename>.[index]jq 支持管道 |,它如同 linux 命令中的管道线——把前面命令的输出当作是后面命令的输入。 如下命令把 .[0] 作为 {...} 的输入,进而访问嵌套的属性,如 .name.address.city

cat test.json | jq '.[0] | {name:.name,city:.address.city}'

# 输出:

{
  "name": "xiaoming",
  "city": "上海"
}

cat test.json | jq '.[0] | {phone:.contacts[0].phone,city:.address.city}'

#输出:

{
  "phone": "132156465",
  "city": "上海"
}

修改 json

# 修改属性的值,重定向到新的文件
MM_FILE=info.json
MM_AGE=18
get_name() {
  return 'xiaoming'
}
jq '.people.address = "shanghai"' $MM_FILE > $MM_FILE.tmp
jq '.people.name = "'$(get_name)'"' $MM_FILE > $MM_FILE.tmp
jq '.people.age = "'${MM_AGE}'"' $MM_FILE > $MM_FILE.tmp

# 输出数组,输出加上`[]`
cat test.json | jq '[.[0] | {name:.name,city:.address.city}]'

# 输出:
[
  {
    "name": "xiaoming",
 "city": "上海"
  }
]

# 添加属性
cat test.json | jq '[.[0] | {name_cp:.name,city_cp:.address.city}]'

# 输出:
[
  {
    "name_cp": "xiaoming",
 "city_cp": "上海"
  }
]

参考资料