天天看點

linux在目錄下建立json檔案,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}/atexit4 chmod a+x ${LOCAL}/atexit5 trap "${LOCAL}/atexit ; rm -rf $LOCAL"EXIT6 trap "exit"INT QUIT TERM7 JSON=${LOCAL}/j8 OUT=${LOCAL}/out9 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" >$JSON18 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/shLOCAL=`mktemp -d`echo '#!/bin/sh' > ${LOCAL}/atexitchmod a+x ${LOCAL}/atexit

trap"${LOCAL}/atexit ; rm -rf $LOCAL"EXIT

trap"exit"INT QUIT TERM

JSON=${LOCAL}/j

OUT=${LOCAL}/out

JFILE=$1POS=$2J=$3

if [ -z "$J" ] ; then

echo Usage: $0 JFILE POS JSON >&2exit1

fi

echo "$J" >$JSONif ! jq . "$JSON" > /dev/null 2>&1 ; then

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

fi

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

echo "$JFILE not in JSON" >&2exit1

fi

if jq "$POS += [$J]" "$JFILE" > $OUT ; then

mv $OUT "$JFILE"exit0

elseexit1

fi