翼度科技»论坛 云主机 LINUX 查看内容

shell读取配置文件-sed命令

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
在编写启动脚本时,涉及到读取配置文件,特地记录下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
  1. 方式一:先试使用grep获取配置项的开始行、结束行。
复制代码
  1. # grep -n -E '^\[' config.ini |grep -A 1 "\[MYSQL\]"|awk -F ':' '{print $1}'|xargs
  2. 2 10
  3. # grep -n -E '^\[' config.ini |grep -A 1 "\[REDIS\]"|awk -F ':' '{print $1}'|xargs
  4. 19
复制代码
在使用sed根据开始行、结束行获取实际配置
  1. # sed -n "2,10 s/DB_HOST=//p" config.ini
  2. 192.168.0.1
  3. # sed -n "19,$ s/DB_PORT=//p" config.ini
  4. 6379
复制代码
方式二:使用正则匹配唯一的配置项名称,并显示实际配置
  1. # sed -r -n 's/(^MYSQL_INIT_SQL=)(.*)$/\2/p' config.ini
  2. 'set slave;stop backup;'
  3. # sed -r -n 's/(^MYSQL_DB_HOST=)(.*)$/\2/p' config.ini
  4. 192.168.0.2
复制代码
完整脚本如下:
  1. # cat config.sh
  2. #!/bin/bash
  3. set -e
  4. exit_script(){
  5.    exit 1
  6. }
  7. if [ "$#" = 0 ]; then
  8.     echo "参数错误,命令格式为:    ./config.sh configfile"
  9.     exit_script
  10. else
  11.     configPath=$1
  12. fi
  13. function get_line_num(){
  14.     local configKey=$1
  15.     grep -n -E '^\[' ${configPath} |grep -A 1 "\[${configKey}\]"|awk -F ':' '{print $1}'|xargs
  16. }
  17. function get_config(){
  18.     #local configPath=$1
  19.     local configKey=$1
  20.     local configName=$2
  21.     local line_num=$(get_line_num $configKey)
  22.     local startLine=$(echo $line_num |awk '{print $1}')
  23.     local endLine=$(echo $line_num|awk '{print $2}')
  24.     if [ ${endLine} ];then
  25.         sed -n "${startLine},${endLine} s/${configName}=//p" ${configPath}
  26.     else
  27.         sed -n "${startLine},$ s/${configName}=//p" ${configPath}
  28.     fi
  29. }
  30. if [ -f $configPath ];then
  31.     MYSQL_DB_HOST=$(get_config MYSQL DB_HOST)
  32. else
  33.     echo ${configPath}"文件不存在,请检查配置文件是否存在"
  34.     exit_script
  35. fi
  36. MYSQL_DB_PASSWD=$(get_config MYSQL DB_PASSWD)
  37. MYSQL_DB_USER=$(get_config MYSQL DB_USER)
  38. REDIS_DB_HOST=$(get_config REDIS DB_HOST)
  39. REDIS_DB_PASSWD=$(get_config REDIS DB_PASSWD)
  40. MYSQL_DB_HOST=$(sed -r -n 's/(^MYSQL_DB_HOST=)(.*)$/\2/p' $configPath)
  41. MYSQL_DB_NAME=$(sed -r -n 's/(^MYSQL_DB_NAME=)(.*)$/\2/p' $configPath)
  42. INIT_SQL=$(sed -r -n 's/(^MYSQL_INIT_SQL=)(.*)$/\2/p' $configPath)
  43. echo "MYSQL_DB_HOST="${MYSQL_DB_HOST}
  44. echo "MYSQL_DB_PASSWD="${MYSQL_DB_PASSWD}
  45. echo "MYSQL_DB_USER="${MYSQL_DB_USER}
  46. echo "REDIS_DB_HOST="${REDIS_DB_HOST}
  47. echo "REDIS_DB_PASSWD="${REDIS_DB_PASSWD}
  48. echo "-----------------分割线-------------"
  49. echo "使用sed读取配置:MYSQL_DB_HOST="${MYSQL_DB_HOST}
  50. echo "使用sed读取配置:MYSQL_DB_NAME="${MYSQL_DB_NAME}
  51. echo "使用sed读取配置:MYSQL_INIT_SQL="${INIT_SQL}
复制代码
实际执行结果:
  1. # ./config.sh config.i
  2. config.i文件不存在,请检查配置文件是否存在
  3. # ./config.sh config.ini
  4. MYSQL_DB_HOST=192.168.0.2
  5. MYSQL_DB_PASSWD=mysql1234
  6. MYSQL_DB_USER=root
  7. REDIS_DB_HOST=192.168.0.1
  8. REDIS_DB_PASSWD=redis1234
  9. -----------------分割线-------------
  10. 使用sed读取配置:MYSQL_DB_HOST=192.168.0.2
  11. 使用sed读取配置:MYSQL_DB_NAME=bigdata1
  12. 使用sed读取配置:MYSQL_INIT_SQL='set slave;stop backup;'
复制代码
 

来源:https://www.cnblogs.com/qiuxiao/p/17305725.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具