Shell脚本读取ini配置文件的实现代码2例

一、简单版

参考stackoverflow的例子,改了一个出来:

代码如下:

while IFS='= ' read var val
do
    if [[ $var == \[*] ]]
    then
        section=$(echo $var | sed 's/^\[\(.*\)\]$/\1/')
    elif [[ $val ]]
    then
        if [ -z $section ];then
            declare "${var}=$val"
        else
            declare "${section}.${var}=$val"
        fi 
    fi 
done < config.ini

使用的时候:

代码如下:

${section.key}

就可以读到变量啦。

二、复杂版

代码如下:

[comon]
ids=com1,com2,com3
files=profilefile
 
 
[com1]
key="name"
file="test"
 
[com2]
key="name1"
file="test"
 
[com3]
key="name2"
file="test"

取[com1]的key值我查了下,还好在ChinaUnix里面查到了命令(貌似一位叫wintty兄写的):

代码如下:

awk -F '=' '/\[com1\]/{a=1}a==1&&$1~/key/{print $2;exit}' config.ini

这样就简单取到值了。
查了下命令终于明白,命令分为两个部分:
先模式匹配到:[com1]然后执行动作:a=1,再接着有来个模式+命令
模式:“a==1&&$1~/key/”
a==1因为已经赋值了,所以执行下一步,如果$1第一个字段匹配key的值,则
打印第2项,紧接着退出,退出就不会打印到匹配[com2]和[com3]的key值.
 
需求会变得,现在变成取【com】几个key对应的值,提供的shell的脚本如下:

代码如下:

#!/bin/sh
getconfig()
{
  SECTION=$1
  CONFILE=$2
  ENDPRINT="key\tfile\t"
  echo "$ENDPRINT"
  for loop in `echo $ENDPRINT|tr '\t' ' '`
  do
       #这里面的的SECTION的变量需要先用双引号,再用单引号,我想可以这样理解,
       #单引号标示是awk里面的常量,因为$为正则表达式的特殊字符,双引号,标示取变量的值
       #{gsub(/[[:blank:]]*/,"",$2)去除值两边的空格内容
       awk -F '=' '/\['"$SECTION"'\]/{a=1}a==1&&$1~/'"$loop"'/{gsub(/[[:blank:]]*/,"",$2);printf("%s\t",$2) ;exit}' $CONFILE
  done
}
 
#更改变量名称
CONFIGFILE=$1
echo "========================================================"
#文件名称
echo "+++ConfigName:$CONFIGFILE+++++++++++++++++++++++++++++++"
#取得ids中的每个id把,号分隔改成空格,因为循环内容要以空格分隔开来
profile=`sed -n '/ids/'p $CONFIGFILE | awk -F= '{print $2}' | sed 's/,/ /g'`
#对于一个配置文件中的所有id循环
for OneCom in $profile
do
  echo "--------------------------------------------------"
  echo "COM:$OneCom"
  #此处函数调用有时候不能用反引号,不然会出错,此处原由还不清楚知道的麻烦请告之
  getconfig  $OneCom  $CONFIGFILE
  echo "\n"
  echo "--------------------------------------------------"
  #break
done
echo "========================================================"

执行的结果如下:

代码如下:

$ one.sh File
========================================================
+++ConfigName:File+++++++++++++++++++++++++++++++
--------------------------------------------------
COM:com1
key     file  
name    file1 
--------------------------------------------------
--------------------------------------------------
COM:com2
key     file  
name1   file2 
--------------------------------------------------
--------------------------------------------------
COM:com3
key     file  
name2   file3 
--------------------------------------------------

嘿嘿需求又变了,配置文件有多个,怎么取多个文件的配置项嘛:

代码如下:

#!/bin/sh
getconfig()
{
  SECTION=$1
  CONFILE=$2
  ENDPRINT="key\tfile\t"
 
  echo "$ENDPRINT"
  for loop in `echo $ENDPRINT|tr '\t' ' '`
  do
  
       awk -F '=' '/\['"$SECTION"'\]/{a=1}a==1&&$1~/'"$loop"'/{gsub(/[[:blank:]]*/,"",$2);printf("%s\t",$2) ;exit}' $CONFILE
  done
}
 
#显示的多个文件名将多行的回车符转成逗号分隔符
CONFIGFILES=`ls $1|tr '\n' ','`
#查看到底有多个配置文件
_Num=`echo $CONFIGFILES|tr -cd \,|wc -c`
#临时变量保存配置多个文件
_TMPFILES=$CONFIGFILES
while [ $_Num -ge 1 ]
do
  #得到一个文件
  CONFIGFILE=`echo $_TMPFILES|cut -d ',' -f1`
  #余下的文件
  _TMPFILES=`echo $_TMPFILES|cut -d ',' -f2-`
  #配置文件数量减一
  _Num=$(($_Num-1))
  echo "========================================================"
  #文件名称
  echo "+++ConfigName:$CONFIGFILE+++++++++++++++++++++++++++++++"
  profile=`sed -n '/ids/'p $CONFIGFILE | awk -F= '{print $2}' | sed 's/,/ /g'`
  #对于一个配置文件中的所有id循环
  for OneCom in $profile
  do
    echo "--------------------------------------------------"      
    echo "COM:$OneCom"
    getconfig  $OneCom  $CONFIGFILE
    echo "\n"
    echo "--------------------------------------------------"
    #break
  done
echo "========================================================"
done

两个小时终于写好了,请各位转载的时候不要忘记加上我的地址哦,也不枉费我辛苦一场。

(0)

相关推荐

  • 利用Shell脚本循环读取文件中每一行的方法详解

    前言 本文主要给大家介绍了关于使用Shell脚本循环读取文件每一行的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.使用for循环 for line in `cat filename` do echo $line done 或者 for line in $(cat filename) do echo $line done 二.使用while循环 while read -r line do echo $line done < filename While循环中rea

  • shell按行读取文件的3种方法

    方法有很多,下面写出三种方法:写法一: 复制代码 代码如下: #!/bin/bashwhile read linedoecho $linedone < filename(待读取的文件) 写法二: 复制代码 代码如下: #!/bin/bashcat filename(待读取的文件) | while read linedoecho $linedone 写法三: 复制代码 代码如下: for line in `cat filename(待读取的文件)`doecho $linedone 说明:for逐行

  • Shell实现读取ini格式配置文件方法

    ini文件格式一般都是由节.键.值三部分组成 格式: [第一节 ] 第一个键 = 值 第二个键 = 第二个值 [第二节 ] 第一个键 = val1,val2,val3 例子: 复制代码 代码如下: [COM] KINGGOO = jb51.net 其实这个作用没那么特别大,但多个shell如果每个配置信息都在shell文件里面写,懂的人还好,半懂+不仔细的人要如何改,改几个地方估计脚本就不能运行了.所以这样单独哪出来比较好些,而且可以多个shell使用一个ini文件(与扩展名无关)来做配置也可以

  • Shell脚本读取标准ini配置文件Demo

    ini DEMO 复制代码 代码如下: [TESTFTP] host=127.0.0.1 name=my pass=mylove type=ftp [TESTSSH] host=127.0.0.1 name=my pass=mylove type=ssh [END] Shell脚本: 复制代码 代码如下: initConf() { HOSTID=$1 CONF=$2 echo "----cat----" cat $CONF \\     | grep -v ^$ \\     | se

  • Shell脚本一次读取文件中一行的2种写法

    写法一: 复制代码 代码如下: #!/bin/bash while read line do       echo $line     #这里可根据实际用途变化 done < urfile 写法二: 复制代码 代码如下: #!/bin/bash cat urfile | while read line do     echo $line done 注意:以上代码中urfile 为被读取的文件 Shell读取文本文件 方法一:通过命令获取所需内容,传递给变量 复制代码 代码如下: var1=$(g

  • Shell脚本中使用for循环和cat命令实现按顺序合并文件

    工作目录下面有mydoc1.txt,mydoc2.txt...mydoc41.txt,本来想用sed排列依次取值排序,然后用cat来合并这些文件,发现达不到预期效果,合并令如下所示: 复制代码 代码如下: ls -lF *.txt | sed  -n '/mydoc1/,/mydoc41/p' | xargs -i cat {}> >mynew.txt 发现用其命令达不到预期效果,后来经检查发现,问题应该出现在sed排序上面,它仍然是按照位数来进行排序,并没有智能的按照范围来排序,sed取值命

  • Shell逐行读取文件的4种方法

    在Linux中有很多方法逐行读取一个文件的方法,其中最常用的就是下面的脚本里的方法,而且是效率最高,使用最多的方法.为了给大家一个直观的感受,我们将通过生成一个大的文件的方式来检验各种方法的执行效率. 方法1:while循环中执行效率最高,最常用的方法. 复制代码 代码如下: function while_read_LINE_bottm(){ While read LINE do echo $LINE done  < $FILENAME } 注释:我习惯把这种方式叫做read釜底抽薪,因为这种方

  • Shell脚本逐行读取文本文件(不改变文本格式)

    网上有很多 shell script 读文本文件的例子,但是都没有讲出故事的全部,只说了一半.举个例子,比如从一个 testfile 文件中读取如下格式的文本行: 复制代码 代码如下: $ vi testfile ls      -a -l /bin |  sort ls      -a -l /bin |  sort | wc ls      -a -l |  grep sh | wc ls      -a -l ls      -a -l |       sort      |    wc

  • PowerShell读取文本文件指定行内容的方法

    本文介绍一个PowerShell中如何一步到位的获取到一个文本文件的第N行.比如一个文本文件,它有1000行,我想把第500行的内容直接取出来的,最简单的方法是通过PowerShell来实现. 在PowerShell中,可以通过Get-Content这个cmdlet来获取文本文件的内容.Get-Content将一个文本文件读取到一个数组中,每一个数组元素就是文件的一行内容.比如一个文本文件内容如下: 复制代码 代码如下: 111 222 333 那么,使用Get-Content获取到一个数组,数

  • Shell脚本读取ini配置文件的实现代码2例

    一.简单版 参考stackoverflow的例子,改了一个出来: 复制代码 代码如下: while IFS='= ' read var val do     if [[ $var == \[*] ]]     then         section=$(echo $var | sed 's/^\[\(.*\)\]$/\1/')     elif [[ $val ]]     then         if [ -z $section ];then             declare "${

  • CAPL 脚本对.ini 配置文件的高阶操作

    目录 前言 批量读取代码讲解 批量写入代码讲解 更新INI文件键值对 删除INI文件键值对 增加INI文件键值对 新建INI文件 前言 前面其实我们已经掌握了对配置文件,文本文件的读写函数和方法,如果一个INI文件只有少许的键值对,那么用内置函数也还凑合,但是当INI文件中的键值对多了起来,内置函数一个一个去读写的方式就非常繁琐,本节就针对这种情况对INI文件的读写方式进行升级,以达到快速便捷读写多键值对的情况 演示软硬件环境 Win10 x64 : CANoe 11 SP2 x64 批量读取代

  • 用shell命令读取与输出数据的代码

    shell脚本读取数据有以下几种方式:1.键盘输入,默认2.从文件中读取3.通过管道命令传递 echo的功能:\c :不换行\f :进纸\t :跳格\n :换行\表示转义,例如:"\"/dev/rmt0"\"翻译为,"/dev/rmt0" read:从键盘或文件的某一行文本中读取信息,并将其赋给一个变量. 复制代码 代码如下: [jb51]/>read namehello i am a regular user[jb51]/>echo

  • python读取ini配置文件过程示范

    这篇文章主要介绍了python读取ini配置文件过程示范,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 安装 pip install configparser 1 配置文件 config.ini: [MysqlDB] user=root passwd=123456 sport=3306 db_name=my_db charset=utf-8 获取参数: import configparser config = configparser.Conf

  • Shell脚本连接oracle数据库的实现代码

    最近研究了一下怎样使用shell 脚本连接数据库,然后执行查询语句.这样对于需要定时执行的脚本,我们可以建个 crontab 去定时执行. 先介绍一下客户端的安装: linux 环境需要用 sqlplus 客户端去连接oracle 数据库,首先我们需要确认有没有安装:which sqlplus如果没有安装就需要先安装一下,安装步骤如下: 到oracle 官网下载,之后安装以下两个模块: rpm -ivh oracle-instantclient11.2-basic-11.2.0.3.0-1.x8

  • Python读取ini配置文件传参的简单示例

    前言 为了往我们写好的Python代码传入参数,有很多种方法,比如使用input获取从DOS 输入的参数,又或者读取txt 文件中的字符作为参数.但为了比较规范,在windows 上我们常常用ini的配置文件进行工具配置.因此,今天我们说明下如果使用python 读取ini 文件. 一.后缀 ini 配置文件介绍 我们新建一个txt 文件,将后缀改为.ini形式,在ini文件中按照分组写入需要的参数. ini示例: # 定义arnold分组 [arnold] # 分组名称 platformNam

  • java 读写 ini 配置文件的示例代码

    下面通过代码先看下java 读写 ini 配置文件,代码如下所示: package org.fh.util; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.net.URLDecoder; import java.util.regex.

  • C++读取INI配置文件类实例详解

    本文以实例讲解了C++读取配置文件的方法. 一般情况下,我们都喜欢使用ini扩展名的文件作为配置文件,可以读取及修改变量数值,也可以设置新的组,新的变量,本文的实例代码一个是读取INI的定义文件,另一个是CIniFile类实现文件,两者结合,完美实现VC++对INI文件的读写. 用户接口说明:在成员函数SetVarStr和SetVarInt函数中,当iType等于零,则如果用户制定的参数在ini文件中不存在,则就写入新的变量.当iType不等于零,则如果用户制定的参数在ini文件中不存在,就不写

随机推荐