Shell中使用sed解析cfg文件

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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值