cfg文件是一种常见配置文件,存储结构可以看做是二级Map,在Shell脚本中可以使用sed来解析得到想要的值
1. 一个cfg示例文件:config.cfg
[a]
a=aa
b=ab
[b]
a=ba
b=bb
[c]
a=ca
b=cb
c=cc
2. 解析的shell脚本:get_cfg.sh
#!/bin/bash
function get_sec_value()
{
local file_name="${1}" # cfg文件
local sec_name="${2}" # 一个key-value块名
local key_name="${3}" # 一个key-value块中的key
local line_number=$(cat ${file_name} | grep -n "^[ ]*\[[ ]*${sec_name}[ ]*\]" | sed -n '1p' | awk -F ':' '{print $1}')
if [ "x${line_number}" = "x" ];then
return 1
fi
# 获取目标key-value块,并输出到临时文件中
local temp_file="$(dirname ${file_name})/get_sec_value.$(date '+%Y%m%d%H%M%S')"
awk -F '#' '{print $1}' ${file_name} | sed '/^[ ]*$/d' | sed -n "/^[ ]*\[[ ]*${sec_name}[ ]*\]/,/^[ ]*\[.*\]/p" | sed '/^[ ]*\[.*\]/d' > ${temp_file}
# 若key_name不为空,则查找输出对应的值
if [ "x${key_name}" != "x" ];then
if [ "x$(cat ${temp_file} | grep "^[ ]*${key_name}[ ]*=.*" | sed -n '1p')" != "x" ];then
echo $(cat ${temp_file} | grep "^[ ]*${key_name}[ ]*=.*" | sed -n '1p' | awk -F '=' '{print $2}')
rm -f ${temp_file}
return 0
else
rm -f ${temp_file}
return 1
fi
fi
# 若key_name为空,则把目标块中的所有行输出到一个数组中
local count=0
unset RETURN
while read line
do
RETURN[${count}]=${line}
((count+=1))
done < ${temp_file}
rm -f ${temp_file}
return 0
}
echo $(get_sec_value config.cfg a b)
get_sec_value config.cfg c
for value in ${RETURN[@]}
do
echo ${value}
done
get_sec_value config.cfg b
for value in ${RETURN[@]}
do
echo ${value}
done
exit 0
3. 执行结果
RealJt-Mac:RealJt ~ $ ./get_cfg.sh
ab
a=ca
b=cb
c=cc
a=ba
b=bb