linux jq 数组,linux shell脚本 用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`

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

fi

echo "$J" > $JSON

if ! jq . "$JSON" > /dev/null 2>&1 ; then

echo "'$JSON' not in JSON" >&2

exit 1

fi

if ! jq . "$JFILE" > /dev/null 2>&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

标签:map,shell,jq,JFILE,JSON,exit,echo,LOCAL

来源: https://www.cnblogs.com/yjb333/p/10370521.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值