shell读取配置文件-sed命令

  • shell读取配置文件-sed命令已关闭评论
  • 163 次浏览
  • A+
所属分类:linux技术
摘要

在编写启动脚本时,涉及到读取配置文件,特地记录下shell脚本读取启动文件的方式。主要提供两种格式的读取方式,方式一配置文件采用“[]”进行分区,方式二配置文件中需要有唯一的配置项名称。

在编写启动脚本时,涉及到读取配置文件,特地记录下shell脚本读取启动文件的方式。主要提供两种格式的读取方式,方式一配置文件采用“[]”进行分区,方式二配置文件中需要有唯一的配置项名称。

配置文件格式如下:

# cat -n config.ini
1 #MYSQL配置项
2 [MYSQL]
3 DB_HOST=192.168.0.1
4 DB_PORT=3306
5 DB_USER=root
6 DB_PASSWD=mysql1234
7 DB_NAME=system_manager1
8
9 #MYSQL_1配置项
10 [MYSQL_1]
11 MYSQL_DB_HOST=192.168.0.2
12 MYSQL_DB_PORT=2200
13 MYSQL_DB_USER=root
14 MYSQL_DB_PASSWD=mysql123456
15 MYSQL_DB_NAME=bigdata1
16 MYSQL_INIT_SQL='set slave;stop backup;'
17
18 #REDIS配置项
19 [REDIS]
20 DB_HOST=192.168.0.1
21 DB_PORT=6379
22 DB_ID=4
23 DB_PASSWD=redis1234

方式一:先试使用grep获取配置项的开始行、结束行。
# grep -n -E '^[' config.ini |grep -A 1 "[MYSQL]"|awk -F ':' '{print $1}'|xargs 2 10  # grep -n -E '^[' config.ini |grep -A 1 "[REDIS]"|awk -F ':' '{print $1}'|xargs 19

在使用sed根据开始行、结束行获取实际配置

# sed -n "2,10 s/DB_HOST=//p" config.ini 192.168.0.1  # sed -n "19,$ s/DB_PORT=//p" config.ini 6379

方式二:使用正则匹配唯一的配置项名称,并显示实际配置

# sed -r -n 's/(^MYSQL_INIT_SQL=)(.*)$/2/p' config.ini 'set slave;stop backup;'  # sed -r -n 's/(^MYSQL_DB_HOST=)(.*)$/2/p' config.ini 192.168.0.2

完整脚本如下:

# cat config.sh #!/bin/bash set -e  exit_script(){    exit 1 }  if [ "$#" = 0 ]; then     echo "参数错误,命令格式为:    ./config.sh configfile"     exit_script else     configPath=$1 fi  function get_line_num(){     local configKey=$1     grep -n -E '^[' ${configPath} |grep -A 1 "[${configKey}]"|awk -F ':' '{print $1}'|xargs }  function get_config(){     #local configPath=$1     local configKey=$1     local configName=$2     local line_num=$(get_line_num $configKey)     local startLine=$(echo $line_num |awk '{print $1}')     local endLine=$(echo $line_num|awk '{print $2}')     if [ ${endLine} ];then         sed -n "${startLine},${endLine} s/${configName}=//p" ${configPath}     else         sed -n "${startLine},$ s/${configName}=//p" ${configPath}     fi }  if [ -f $configPath ];then     MYSQL_DB_HOST=$(get_config MYSQL DB_HOST) else     echo ${configPath}"文件不存在,请检查配置文件是否存在"     exit_script fi MYSQL_DB_PASSWD=$(get_config MYSQL DB_PASSWD) MYSQL_DB_USER=$(get_config MYSQL DB_USER) REDIS_DB_HOST=$(get_config REDIS DB_HOST) REDIS_DB_PASSWD=$(get_config REDIS DB_PASSWD)  MYSQL_DB_HOST=$(sed -r -n 's/(^MYSQL_DB_HOST=)(.*)$/2/p' $configPath) MYSQL_DB_NAME=$(sed -r -n 's/(^MYSQL_DB_NAME=)(.*)$/2/p' $configPath) INIT_SQL=$(sed -r -n 's/(^MYSQL_INIT_SQL=)(.*)$/2/p' $configPath)  echo "MYSQL_DB_HOST="${MYSQL_DB_HOST} echo "MYSQL_DB_PASSWD="${MYSQL_DB_PASSWD} echo "MYSQL_DB_USER="${MYSQL_DB_USER} echo "REDIS_DB_HOST="${REDIS_DB_HOST} echo "REDIS_DB_PASSWD="${REDIS_DB_PASSWD}  echo "-----------------分割线-------------" echo "使用sed读取配置:MYSQL_DB_HOST="${MYSQL_DB_HOST} echo "使用sed读取配置:MYSQL_DB_NAME="${MYSQL_DB_NAME} echo "使用sed读取配置:MYSQL_INIT_SQL="${INIT_SQL}

实际执行结果:

# ./config.sh config.i config.i文件不存在,请检查配置文件是否存在  # ./config.sh config.ini MYSQL_DB_HOST=192.168.0.2 MYSQL_DB_PASSWD=mysql1234 MYSQL_DB_USER=root REDIS_DB_HOST=192.168.0.1 REDIS_DB_PASSWD=redis1234 -----------------分割线------------- 使用sed读取配置:MYSQL_DB_HOST=192.168.0.2 使用sed读取配置:MYSQL_DB_NAME=bigdata1 使用sed读取配置:MYSQL_INIT_SQL='set slave;stop backup;'