导师分配了一个产线日志转换的项目,线上产生的日志是多个文件,可读性不高,需求是把所有的日志转换成JSON文件。每一个字段对应一个值,看起来清晰明了。
之前没写过shell脚本,不知道怎么处理JSON,之前用过的都是封装好的函数,但是linux还是爸爸,什么都有,有jq命令。还有JSON真是个好东西。
由于之前不知道如何用jq生成JSON文件,所以我用了最原始的方法,用字符串拼接,把一个个字符串拼接成了JSON格式。(注意:JSON里只有JSON保留字,数字和字符串,
其他的都不是JSON。)拼接的坏处就是容易出错,比较繁琐。后来从导师那弄来里那个过脚本,一个是添加数据项的,一个是添加数组的,这样想添加什么就添加什么了。
1.在JSON文件中添加数据项json_object_additem
1 #!/bin/sh
2 LOCAL=`mktemp -d`
3 echo '#!/bin/sh' > ${LOCAL}/atexit
4 chmod 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
13 if [ -z "$J" ] ; then
14 echo Usage: $0 JFILE POS KEY JSON >&2
15 exit 1
16 fi
17 echo "$J" > $JSON
18 if ! jq . "$JSON" > /dev/null 2>&1 ; then
19 echo "'$JSON' not in JSON" >&2
20 exit 1
21 fi
22 if ! jq . "$JFILE" > /dev/null 2>&1 ; then
23 echo "$JFILE not in JSON" >&2
24 exit 1
25 fi
26 if jq "$POS += {$KEY: $J}" "$JFILE" > $OUT ; then
27 mv $OUT "$JFILE"
28 exit 0
29 else
30 exit 1
31 fi
代码注释:首先创建临时目录,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
OUT=${LOCAL}/out
JFILE=$1
POS=$2
J=$3
if [ -z "$J" ] ; then
echo Usage: $0 JFILE POS JSON >&2
exit 1
echo "$J" > $JSON
if ! jq . "$JSON" > /dev/null 2>&1 ; then
echo "'$JSON' not in JSON" >&2
exit 1
if ! jq . "$JFILE" > /dev/null 2>&1 ; then
echo "$JFILE not in JSON" >&2
exit 1
if jq "$POS += [$J]" "$JFILE" > $OUT ; then
mv $OUT "$JFILE"
exit 0
exit 1