bash 修改 json 文件字段
- 运维笔记
- 2020-05-25
- 310热度
- 0评论
导航
0 前提准备
需要有 jq 命令。如果没有需要先安装(如 ubuntu,使用 apt-get install jq)。
1 细节分解
1.1 修改单个 json 对象中的字段
jq '.attr_field=xxx' test.json
1.2 修改 json 对象数组中的字段(无过滤条件)
jq 'map(.attr_field=xxx)' test.json
1.3 修改 json 对象数组中的字段(有过滤条件)
(只修改 id 为 baz 的 json 对象)
jq 'map(if .id=="baz" then .attr_field=xxx)' test.json
1.4 jq 的结果替换原始 json 文件
jq '.attr_field=xxx' test.json > conf.tmp && mv conf.tmp test.json
1.5 pretty print 输出 json 变量
echo $content | jq . > output.json
2 综合案例
2.1 需求描述
config.json 内容如下:
[ { "tags": "玄幻,都市", "start_timestamp": 1590249600, "stop_timestamp": 1590336000, "output_path": "./output" } ]
将 config.json 中的 start_timestamp 和 end_timestamp 的值改为昨天的 0 点到 24 点的时间戳。
2.2 脚本代码
#!/bin/bash # 将配置文件中的时间戳改为前一天的时间(0:00-24:00) # (可配合 crontab,每天自动运行) # 配置文件的路径,根据实际情况修改 config_file='./config.json' set -ex function update() { start_time=$(date -d $(date --date="-1 day" +%Y-%m-%d) +%s) end_time=$(date -d $(date +%Y-%m-%d) +%s) content=$(jq "map(.start_timestamp=$start_time)" $config_file) content=$(jq "map(.stop_timestamp=$end_time)" <<< "$content") echo $content | jq . > rule.tmp && mv rule.tmp $config_file } update