zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o:在函数‘_start’中: (.text+0x20):对‘main’未定义的引用
    W: 仓库 “http://ppa.launchpad.net/levi-armstrong/qt-libraries-trusty/ubuntu xenial Release” 没有 Release 文件。
    sudo apt-get常用命令
    Windows 下 MQTT 服务器搭建之Apollo
    sudo apt-get update报错E: 部分索引文件下载失败。如果忽略它们,那将转而使用旧的索引文件。
    struct.error: cannot convert argument to integer解决办法
    PHP MySQL 创建数据库和表 之 Create
    PHP MySQL 连接数据库 之 Connect
    飞行的架构师和奔跑的程序员
    hdu 5610 Baby Ming and Weight lifting
  • 原文地址:https://www.cnblogs.com/yjb333/p/10370521.html
Copyright © 2011-2022 走看看