linuxshell脚本⽤jq命令在JSON⽂件中添加⼀个map或数组
导师分配了⼀个产线⽇志转换的项⽬,线上产⽣的⽇志是多个⽂件,可读性不⾼,需求是把所有的⽇志转换成JSON⽂件。每⼀个字段对应⼀个值,看起来清晰明了。
之前没写过shell脚本,不知道怎么处理JSON,之前⽤过的都是封装好的函数,但是linux还是爸爸,什么都有,有jq命令。还有JSON真是个好东西。
由于之前不知道如何⽤jq⽣成JSON⽂件,所以我⽤了最原始的⽅法,⽤字符串拼接,把⼀个个字符串拼接成了JSON格式。(注意:JSON ⾥只有JSON保留字,数字和字符串,
其他的都不是JSON。)拼接的坏处就是容易出错,⽐较繁琐。后来从导师那弄来⾥那个过脚本,⼀个是添加数据项的,⼀个是添加数组的,这样想添加什么就添加什么了。
1.在JSON⽂件中添加数据项json_object_additem
1 #!/bin/sh
2 LOCAL=`mktemp -d`
3echo'#!/bin/sh' > ${LOCAL}/atexit
4chmod a+x ${LOCAL}/atexit
5 trap "${LOCAL}/atexit ; rm -rf $LOCAL" EXIT
6 trap "exit" INT QUIT TERM
7 JSON=${LOCAL}/j
8 OUT=${LOCAL}/out
9 JFILE=$1
10 POS=$2
11 KEY=$3
12 J=$4
13if [ -z "$J" ] ; then
14echo Usage: $0 JFILE POS KEY JSON >&2
15 exit 1
16fi
17echo"$J" > $JSON
18if ! jq . "$JSON" > /dev/null2>&1 ; then
19echo"'$JSON' not in JSON" >&2
20 exit 1
21fi
22if ! jq . "$JFILE" > /dev/null2>&1 ; then
23echo"$JFILE not in JSON" >&2
24 exit 1
25fi
26if jq "$POS += {$KEY: $J}""$JFILE" > $OUT ; then
27mv $OUT "$JFILE"
28 exit 0
29else
30 exit 1
31fi
代码注释:⾸先创建临时⽬录,JSON是存储value参数的,看是否是JSON格式。OUT是保存jq命令⽣成结果的。JFILE是⽬标JSON⽂件参数,POS是添加数据的位置,KEY是键值,J是value,
然后检查传递的参数是否正确,再检查最后⼀个参数是否是JSON格式,再检查传⼊的⽬标⽂件是否是JSON格式,最后把数据添加到⽂件中。
使⽤⽅法:echo '{}' > ./tmp
./json_object_additem tmp . project "aaaa"
下⾯的脚本思路和上⼀个基本⼀致,就不再重复说了。
2.在JSON⽂件中添加数组json_array_append
#!/bin/sh
LOCAL=`mktemp -d`
echo'#!/bin/sh' > ${LOCAL}/atexit
chmod a+x ${LOCAL}/atexit
trap "${LOCAL}/atexit ; rm -rf $LOCAL" EXIT
trap "exit" INT QUIT TERM
JSON=${LOCAL}/j
json检查OUT=${LOCAL}/out
JFILE=$1
POS=$2
J=$3
if [ -z "$J" ] ; then
echo Usage: $0 JFILE POS JSON >&2
exit 1
fi
echo"$J" > $JSON
if ! jq . "$JSON" > /dev/null2>&1 ; then
echo"'$JSON' not in JSON" >&2
exit 1
fi
if ! jq . "$JFILE" > /dev/null2>&1 ; then echo"$JFILE not in JSON" >&2
exit 1
fi
if jq "$POS += [$J]""$JFILE" > $OUT ; then mv $OUT "$JFILE"
exit 0
else
exit 1
fi
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论