#!/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"
}
]
}
]