導師分配了一個產線日志轉換的項目,線上產生的日志是多個文件,可讀性不高,需求是把所有的日志轉換成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
