0
点赞
收藏
分享

微信扫一扫

[Shell脚本]字典、列表、JSON格式化

#!/bin/bash
#Shell脚本采集及JSON格式化结果文件输出示例
#说明:
#1.两个函数配合使用,可以将采集数据拼接进行JSON格式化输出,一般只需要用到ADD操作即可。采集结果可正常解析并入库到mongoDB。
#2.单独使用可以对数据进行列表、字典格式化操作,支持元素添加、删除操作。删除操作无法处理复杂嵌套数据,仅支持单层数据操作。列表删除支持列表中字符串、字典的删除,列表内嵌套的列表暂不支持。
#Version: 1.0

DICT_EXEC() {
    #字典元素添加,可以将key与value添加至空字典或追加到非空字典中,元素间用","隔开。
    #调用方式:DICT_EXEC 执行方式 目标字典 目标Key字段 目标Value字段
    #DICT_EXEC ADD $DICT $KEY $VALUE
    if [[ $1 == "ADD" ]];then
        DICT=$2
        KEY=$3
        VALUE=$4
        #判断VALUE字符串第一位是否非"["或"{",并初始化为"VALUE"格式
        if [[ "${VALUE:0:1}" != "[" && "${VALUE:0:1}" != "{" ]];then
            VALUE_STR=$(echo \"${VALUE}\")
        else
            #字典或列表字符串保持不变
            VALUE_STR=$VALUE
        fi
        #格式化KEY为"KEY"
        KEY_STR=$(echo \"${KEY}\")
        #如目标字典为空
        if [[ $DICT == "{}" ]];then
            #空字典数据追加
            DICT=$(echo '{'${KEY_STR}':'${VALUE_STR}'}')
        else
            #非空字典数据追加
            #去掉目标字典首位"{"字符
            string="${DICT#?}"
            #去掉目标字典末位"}"字符
            string="${string%?}"
            #字典数据追加并格式化
            DICT=$(echo '{'${string}','${KEY_STR}':'${VALUE_STR}'}')
        fi
    #字典元素删除,支持字典元素中单层未嵌套元素删除。
    #调用方式:DICT_EXEC 执行方式 目标字典 需删除元素的位置序号
    #DICT_EXEC DEL $DICT $DEL_NUM
    elif [[ $1 == "DEL" ]];then
        DICT=$2
        DEL_NUM=$3
        if [[ $DICT == "{}" ]];then
            echo "Error: The dict is null, ADD failed."
            exit 1
        else
            #最后一个元素标记"NF"
            if [[ $DEL_NUM == "NF" ]];then
                DEL_NUM=$(echo $DICT |sed 's/,/\n/g'|wc -l)
            #第一个元素标记"NR"
            elif [[ $DEL_NUM == "NR" ]];then
                DEL_NUM=1
            fi
            #仅支持单层字典元素删除操作
            string="${DICT#?}"
            string="${string%?}"
            string=$(echo $string|sed "s/,/\n/g"|awk "NR!=$DEL_NUM")
            string=$(echo $string|sed "s/ /,/g")
            DICT=$(echo '{'${string}'}')
        fi
    fi
    echo $DICT
}


LIST_EXEC() {
    #列表元素添加,可以将元素添加进空列表或追加到非空列表中,元素间用","隔开。
    #调用方法:LIST_EXEC 执行方式 目标列表 目标字符串
    #LIST_EXEC ADD $LIST $STRING
    if [[ $1 == "ADD" ]];then
        LIST=$2
        str=$3
        #判断VALUE字符串第一位是否非"["或"{",并初始化为"VALUE"格式
        if [[ "${str:0:1}" != "[" && "${str:0:1}" != "{" ]];then
            str=$(echo \"${str}\")
        else
            #字典或列表字符串保持不变
            str=$str
        fi
        #目标列表为空的格式化方式
        if [[ $LIST == "[]" ]];then
            LIST=$(echo '['${str}']')
        else
            #目标列表不为空的格式化方式
            #去掉目标列表首位"["字符
            string="${LIST#?}"
            #再去掉目标列表末位"]"字符
            string="${string%?}"
            #重新拼接成列表格式,列表内元素用","隔开
            LIST=$(echo '['${string}','${str}']')
        fi
    #列表元素删除,支持字符串及字典元素的删除
    #调用方法:LIST_EXEC 执行方式 目标列表 需删除元素的位置序号
    #LIST_EXEC ADD $LIST $DEL_NUM
    elif [[ $1 == "DEL" ]];then
        LIST=$2
        DEL_NUM=$3
        if [[ $LIST == "[]" ]];then
            echo "Error: The list is null, ADD failed."
            exit 1
        else
            #最后一个元素标记"NF"
            if [[ $DEL_NUM == "NF" ]];then
                DEL_NUM=$(echo $LIST |sed 's/,/\n/g'|wc -l)
            #第一个元素标记"NR"
            elif [[ $DEL_NUM == "NR" ]];then
                DEL_NUM=1
            fi
            #仅持列表内字符串、列表内单层字典元素的删除
            string="${LIST#?}"
            string="${string%?}"
            string=$(echo $string|sed 's/,{/_{/g'|sed 's/},/}_/g'|sed "s/_/\n/g"|awk "NR!=$DEL_NUM")
            string=$(echo $string|sed "s/ /,/g")
            LIST=$(echo '['${string}']')
        fi
    fi
    echo $LIST
}

函数调用示例:

1.字典操作示例

#字典操作示例
$ DICT='{}'
$ DICT_EXEC ADD $DICT key1 value1
{"key1":"value1"}
$ DICT_EXEC ADD $DICT key2 value2
{"key1":"value1","key2":"value2"}
$ DICT_EXEC ADD $DICT key3 value3
{"key1":"value1","key2":"value2","key3":"value3"}
$ DICT_EXEC ADD $DICT key4 value4
{"key1":"value1","key2":"value2","key3":"value3","key4":"value4"}
$ DICT_EXEC DEL $DICT 1
{"key2":"value2","key3":"value3","key4":"value4"}
$ DICT_EXEC DEL $DICT NR
{"key3":"value3","key4":"value4"}
$ DICT_EXEC DEL $DICT NF
{"key3":"value3"}

2.列表操作示例

#列表操作示例:
$ LIST='[]'
$ LIST_EXEC ADD $LIST string1
["string1"]
$ LIST_EXEC ADD $LIST string2
["string1","string2"]
$ LIST_EXEC ADD $LIST $DICT
["string1","string2",{"key3":"value3"}]
$ LIST_EXEC ADD $LIST string3
["string1","string2",{"key3":"value3"},"string3"]
$ LIST_EXEC ADD $LIST $DICT
["string1","string2",{"key3":"value3"},"string3",{"key3":"value3"}]
$ LIST_EXEC ADD $LIST string4
["string1","string2",{"key3":"value3"},"string3",{"key3":"value3"},"string4"]
$ LIST_EXEC DEL $LIST 1
[{"key3":"value3"},"string3",{"key3":"value3"},"string4"]
$ LIST_EXEC DEL $LIST NR
["string3",{"key3":"value3"},"string4"]
$ LIST_EXEC DEL $LIST NF
["string3",{"key3":"value3"}]

3.信息采集JSON格式化输出示例

#信息采集JSON格式输出示例:
LIST='[]'
DICT='{}'
hostname="localhost"
IP="127.0.0.1"
Memery_Info="Memery_Info"
Mem_total=$(free -h |grep "Mem" |awk '{print$2}')
Mem_used=$(free -h |grep "Mem" |awk '{print$3}')
Mem_free=$(free -h |grep "Mem" |awk '{print$4}')

DICT_EXEC ADD $DICT "hostname" $hostname
DICT_EXEC ADD $DICT "IP" $IP
#Memery_Info
Memery_Info_Dict="{}"
Memery_Info_Dict=$(DICT_EXEC ADD $Memery_Info_Dict "Mem_total" $Mem_total)
Memery_Info_Dict=$(DICT_EXEC ADD $Memery_Info_Dict "Mem_used" $Mem_used)
Memery_Info_Dict=$(DICT_EXEC ADD $Memery_Info_Dict "Mem_free" $Mem_free)
Memery_Info_List=$(LIST_EXEC ADD "[]" $Memery_Info_Dict)
DICT=$(DICT_EXEC ADD $DICT "Memery_Info" $Memery_Info_List)
#CPU_Info
CPU_Info_List='[]'
CPU_NUM=$(cat /proc/cpuinfo |grep processor|wc -l)
for ((i=1; i<=$CPU_NUM; i++));do
    CPU_Info_Dict='{}'
    processor=$(cat /proc/cpuinfo |grep processor|sed -n ${i}p |awk -F":" '{print$2}')
    vendor_id=$(cat /proc/cpuinfo |grep vendor_id|sed -n ${i}p |awk -F":" '{print$2}')
    model_name=$(cat /proc/cpuinfo |grep 'model name'|sed -n ${i}p |awk -F":" '{print$2}')
    cache_size=$(cat /proc/cpuinfo |grep 'cache size'|sed -n ${i}p |awk -F":" '{print$2}')
    cpu_cores=$(cat /proc/cpuinfo |grep 'cpu cores'|sed -n ${i}p |awk -F":" '{print$2}')
    CPU_Info_Dict=$(DICT_EXEC ADD $CPU_Info_Dict "processor" $processor)
    CPU_Info_Dict=$(DICT_EXEC ADD $CPU_Info_Dict "vendor_id" $vendor_id)
    CPU_Info_Dict=$(DICT_EXEC ADD $CPU_Info_Dict "model_name" $model_name)
    CPU_Info_Dict=$(DICT_EXEC ADD $CPU_Info_Dict "cache_size" $cache_size)
    CPU_Info_Dict=$(DICT_EXEC ADD $CPU_Info_Dict "cpu_cores" $cpu_cores)
    CPU_Info_List=$(LIST_EXEC ADD $CPU_Info_List $CPU_Info_Dict)
done
DICT=$(DICT_EXEC ADD $DICT "CPU_Info" $CPU_Info_List)
data=$(LIST_EXEC ADD $LIST $DICT)
echo $data
>> [{"hostname":"localhost","IP":"127.0.0.1","Memery_Info":[{"Mem_total":"63Gi","Mem_used":"9.7Gi","Mem_free":"53Gi"}],"CPU_Info":[{"processor":"0","vendor_id":"AuthenticAMD","model_name":"AMD","cache_size":"512","cpu_cores":"8"},{"processor":"1","vendor_id":"AuthenticAMD","model_name":"AMD","cache_size":"512","cpu_cores":"8"}]}]
JSON格式化效果:
[
    {
        "hostname": "localhost",
        "IP": "127.0.0.1",
        "Memery_Info": [
            {
                "Mem_total": "63Gi",
                "Mem_used": "9.7Gi",
                "Mem_free": "53Gi"
            }
        ],
        "CPU_Info": [
            {
                "processor": "0",
                "vendor_id": "AuthenticAMD",
                "model_name": "AMD",
                "cache_size": "512",
                "cpu_cores": "8"
            },
            {
                "processor": "1",
                "vendor_id": "AuthenticAMD",
                "model_name": "AMD",
                "cache_size": "512",
                "cpu_cores": "8"
            }
        ]
    }
]

举报

相关推荐

0 条评论