Chinaunix首页 | 论坛 | 博客
  • 博客访问: 593665
  • 博文数量: 226
  • 博客积分: 10080
  • 博客等级: 上将
  • 技术积分: 1725
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-26 11:15
文章分类

全部博文(226)

文章存档

2011年(5)

2010年(64)

2009年(99)

2008年(37)

2007年(21)

我的朋友

分类: LINUX

2009-12-19 14:34:18

     昨天熬了夜,纯属打酱油,顺便帮同事看了下查看INI文件内容,不敢独享,拿出来分享下。
 
现有需求用SHELL命令读取INI文件里面的具体的Key值那?加入有INI文件config.ini格式一般如下:
 
[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
 
 
两个小时终于写好了,请各位转载的时候不要忘记加上我的地址哦,也不枉费我辛苦一场。
 
 
 
 
 
 
 
 
 
阅读(2186) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-12-23 10:50:49

必须保证每个section下面的key都相同的,如果有的section下面有一个key,另外一个没有,会找错的。