Awk Command分析和解释

时间:2017-11-16 04:31:12

标签: bash shell awk

我曾尝试阅读一些关于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]”,字段分隔符是'=',但是它正常工作并且可以返回正确的结果,为什么?你能帮我理解一下吗?

非常感谢!

1 个答案:

答案 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`
}