本博客引用自:https://blog.csdn.net/yuzaipiaofei/article/details/6619472
1 2 2011-07-19 16:22 3 4 昨天熬了夜,純屬打醬油,順便幫同事看了下查看INI文件內容,不敢獨享,拿出來分享下。 5 6 現有需求用SHELL命令讀取INI文件里面的具體的Key值那?加入有INI文件config.ini格式一般如下: 7 8 [comon] 9 ids=com1,com2,com3 10 files=profilefile 11 12 13 [com1] 14 key="name" 15 file="test" 16 17 [com2] 18 key="name1" 19 file="test" 20 21 [com3] 22 key="name2" 23 file="test" 24 25 取[com1]的key值我查了下,還好在ChinaUnix里面查到了命令(貌似一位叫wintty兄寫的): 26 awk -F '=' '/\[com1\]/{a=1}a==1&&$1~/key/{print $2;exit}' config.ini 27 這樣就簡單取到值了。 28 查了下命令終於明白,命令分為兩個部分: 29 先模式匹配到:[com1]然后執行動作:a=1,再接着有來個模式+命令 30 模式:“a==1&&$1~/key/” 31 a==1因為已經賦值了,所以執行下一步,如果$1第一個字段匹配key的值,則 32 打印第2項,緊接着退出,退出就不會打印到匹配[com2]和[com3]的key值. 33 34 ------------------------------------------------------------- 35 需求會變得,現在變成取【com】幾個key對應的值,提供的shell的腳本如下: 36 #!/bin/sh 37 getconfig() 38 { 39 SECTION=$1 40 CONFILE=$2 41 ENDPRINT="key\tfile\t" 42 echo "$ENDPRINT" 43 for loop in `echo $ENDPRINT|tr '\t' ' '` 44 do 45 #這里面的的SECTION的變量需要先用雙引號,再用單引號,我想可以這樣理解, 46 #單引號標示是awk里面的常量,因為$為正則表達式的特殊字符,雙引號,標示取變量的值 47 #{gsub(/[[:blank:]]*/,"",$2)去除值兩邊的空格內容 48 awk -F '=' '/\['"$SECTION"'\]/{a=1}a==1&&$1~/'"$loop"'/{gsub(/[[:blank:]]*/,"",$2);printf("%s\t",$2) ;exit}' $CONFILE 49 done 50 } 51 52 #更改變量名稱 53 CONFIGFILE=$1 54 echo "========================================================" 55 #文件名稱 56 echo "+++ConfigName:$CONFIGFILE+++++++++++++++++++++++++++++++" 57 #取得ids中的每個id把,號分隔改成空格,因為循環內容要以空格分隔開來 58 profile=`sed -n '/ids/'p $CONFIGFILE | awk -F= '{print $2}' | sed 's/,/ /g'` 59 #對於一個配置文件中的所有id循環 60 for OneCom in $profile 61 do 62 echo "--------------------------------------------------" 63 echo "COM:$OneCom" 64 #此處函數調用有時候不能用反引號,不然會出錯,此處原由還不清楚知道的麻煩請告之 65 getconfig $OneCom $CONFIGFILE 66 echo "\n" 67 echo "--------------------------------------------------" 68 #break 69 done 70 echo "========================================================" 71 72 73 執行的結果如下: 74 $ one.sh File 75 ======================================================== 76 +++ConfigName:File+++++++++++++++++++++++++++++++ 77 -------------------------------------------------- 78 COM:com1 79 key file 80 name file1 81 -------------------------------------------------- 82 -------------------------------------------------- 83 COM:com2 84 key file 85 name1 file2 86 -------------------------------------------------- 87 -------------------------------------------------- 88 COM:com3 89 key file 90 name2 file3 91 -------------------------------------------------- 92 ======================================================== 93 94 嘿嘿需求又變了,配置文件有多個,怎么取多個文件的配置項嘛: 95 #!/bin/sh 96 getconfig() 97 { 98 SECTION=$1 99 CONFILE=$2 100 ENDPRINT="key\tfile\t" 101 102 echo "$ENDPRINT" 103 for loop in `echo $ENDPRINT|tr '\t' ' '` 104 do 105 106 awk -F '=' '/\['"$SECTION"'\]/{a=1}a==1&&$1~/'"$loop"'/{gsub(/[[:blank:]]*/,"",$2);printf("%s\t",$2) ;exit}' $CONFILE 107 done 108 } 109 110 #顯示的多個文件名將多行的回車符轉成逗號分隔符 111 CONFIGFILES=`ls $1|tr '\n' ','` 112 #查看到底有多個配置文件 113 _Num=`echo $CONFIGFILES|tr -cd \,|wc -c` 114 #臨時變量保存配置多個文件 115 _TMPFILES=$CONFIGFILES 116 while [ $_Num -ge 1 ] 117 do 118 #得到一個文件 119 CONFIGFILE=`echo $_TMPFILES|cut -d ',' -f1` 120 #余下的文件 121 _TMPFILES=`echo $_TMPFILES|cut -d ',' -f2-` 122 #配置文件數量減一 123 _Num=$(($_Num-1)) 124 echo "========================================================" 125 #文件名稱 126 echo "+++ConfigName:$CONFIGFILE+++++++++++++++++++++++++++++++" 127 profile=`sed -n '/ids/'p $CONFIGFILE | awk -F= '{print $2}' | sed 's/,/ /g'` 128 #對於一個配置文件中的所有id循環 129 for OneCom in $profile 130 do 131 echo "--------------------------------------------------" 132 echo "COM:$OneCom" 133 getconfig $OneCom $CONFIGFILE 134 echo "\n" 135 echo "--------------------------------------------------" 136 #break 137 done 138 echo "========================================================" 139 done 140 141 142 兩個小時終於寫好了,請各位轉載的時候不要忘記加上我的地址哦,也不枉費我辛苦一場。 143 http://www.cublog.cn/u1/55091/showart_2125956.html
