天天看點

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      

轉載于:https://www.cnblogs.com/yjb333/p/10370521.html

繼續閱讀