我曾尝试阅读一些关于awk脚本的教程,但对下面的脚本仍有疑问:
get_value_from_ini()
{
section=$1
key_name=$2
echo `awk -F '=' '/\['"$section"'\]/{a=1}a==1&&$1~/'"$key_name"'/{gsub(/[[:blank:]]*/,"",$2); print $2}' $cfg_file`
}
db_user=`get_value_from_ini DB DBUSER`
db_passwd=`get_value_from_ini DB DBPASSWD`
输入config ini文件,如:
....
[DB]
DBUSER=dbuser
DBPASSWD=dbpasswd
...
当我unserstand时,在awk命令中,模式是“[DB]”,字段分隔符是'=',但是它正常工作并且可以返回正确的结果,为什么?你能帮我理解一下吗?
非常感谢!
答案 0 :(得分:0)
虽然代码写得不好,但您只需从左到右阅读:
-F '=' -- As you have said, set FS to =
'/\'"$section"'\]/{a=1} -- If the line contains the information stored in variable section then set a=1
a==1 && $1~/'"$key_name"'/ -- If 'a' set and first field contains the information stored in variable key_name, execute all between {}
{gsub(/[[:blank:]]*/,"",$2); print $2}' -- If previous step returns true, remove all whitespace from second field and then print it out
$cfg_file -- file to be read
这是一个替代方法,可以删除所有额外的引号,这些引号会使读取变得非常混乱,并且可能容易出错:
get_value_from_ini()
{
awk -F '=' -vsection="$1" -vkey_name="$2" '$0 ~ "["section"]"{a=1}a==1 && $1 ~ key_name{gsub(/[[:blank:]]*/,"",$2); print $2}' $cfg_file`
}