[Linux]Shell脚本实现按照模块信息拆分文件内容

示例conf_file文件内容如下

[root@CSDN /home/Sudley/get_conf_info]#cat conf_file
<module_1> info start==
name:lt
address:North
phone:10086
tx.rpm
<module_1> info end==
<module_2> info start==
#nothing
<module_2> info end==
<module_3> info start==
name:yd
address:South
phone:10010
al.rpm
<module_3> info end==

conf_file文件包含module_1、module_2、module_3,module_2没内容,编写脚本将conf_file文件拆分为module_1、module_3两个模块(module_2没内容,不做处理)
代码实现:

#!/bin/bash
# Author:Sudley
# ctime: 2020-05-31

get_conf_info()
{
        conf_file="$1"
        flag="$2"
        if [ ! -f "${conf_file}" ] || [[ -z "${flag}" ]];then
                echo "argument error"
                echo "usage:"
                echo "    ./get_conf_info.sh conf_file flag "
        fi

        print_flag=false
        while read line
        do
                #无视注释的行
                echo "${line}" | grep "^ *#.*" > /dev/null 2>&1 && continue

                if [[ "${line}" =~ "${flag} start==" ]];then
                        module_name=$(echo "${line#<}"|awk -F '>' '{print $1}')
                        print_flag=true
                        continue
                fi
                if [[ "${line}" =~ "${flag} end==" ]];then
                        print_flag=false
                        continue
                fi

                if [ "${print_flag}" = true ];then
                        echo "${line}" >> "${WORKSPACE}/${module_name}"
                fi

        done < "${conf_file}"

}

get_address_rpms()
{
        label="address"
        grep "${label}" "${WORKSPACE}" -rn |awk -F : '{print $1}' >> "${WORKSPACE}/module.list"
        while read module
        do
                grep ".*\.rpm$" "${module}"
        done < "${WORKSPACE}/module.list"
}

export BASE_DIR=`pwd`
export WORKSPACE="${BASE_DIR}/workspace_t"
[[ -d "${WORKSPACE}" ]] && rm -rf "${WORKSPACE}"
mkdir -p "${WORKSPACE}"
get_conf_info "$1" "$2"
get_address_rpms

脚本用法演示:
在这里插入图片描述
当模块数量较多时使用上面方法先拆分模块在查找相关数据效率会比较低,可以直接使用sed读取各个模块的信息,如下

#!/bin/bash
# Author:Sudley
# ctime: 2020-05-31

get_conf_info()
{
        conf_file="$1"
        flag="$2"
        if [ ! -f "${conf_file}" ] || [[ -z "${flag}" ]];then
                echo "argument error"
                echo "usage:"
                echo "    ./get_conf_info.sh conf_file flag "
        fi

        module_list="$(grep "${flag} start==" "${conf_file}" | awk -F '<' '{print $2}' | awk -F '>' '{print $1}')"

        [[ -n "${module_list}" ]] && for module in ${module_list}
        do
                #echo "${module}"
                if sed -n "/<${module}> ${flag} start/,/<${module}> ${flag} end/ p" "${conf_file}" | grep "address" > /dev/null 2>&1;then
                        sed -n "/<${module}> ${flag} start/,/<${module}> ${flag} end/ p" "${conf_file}" | grep ".*\.rpm$"
                fi
        done

}

export BASE_DIR=`pwd`
export WORKSPACE="${BASE_DIR}/workspace_t"
[[ -d "${WORKSPACE}" ]] && rm -rf "${WORKSPACE}"
mkdir -p "${WORKSPACE}"
get_conf_info "$1" "$2"

在这里插入图片描述
运行结果一样但是效率快了将近一倍,当模块数量很多时节约的时间还是很可观的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值