如何在shell脚本中解析配置文件(* .conf)?

时间:2014-03-27 09:29:14

标签: shell app-config sh readfile

我是shell脚本的新手。我有一个文件app.conf

[MySql]
user = root
password = root123
domain = localhost
database = db_name
port = 3306

[Logs]
level = logging.DEBUG

[Server]
port = 8080

我想在shell脚本中解析这个文件,并希望从中提取mysql凭据。我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:8)

我这样做:

pw=$(awk '/^password/{print $3}' app.conf)

user=$(awk '/^user/{print $3}' app.conf)


echo $pw
root123

echo $user
root

$()将变量pw设置为内部命令的输出。内部命令在app.conf文件中查找以password开头的行,然后打印该行中的第3个字段。

<强> EDITED

如果要从配置文件中解析出一堆值,我会为配置文件名创建一个变量:

CONFIG=app.conf
pw=$(awk '/^password/{print $3}' "${CONFIG}")
user=$(awk '/^user/{print $3}' "${CONFIG}")

以下是如何进行两个不同的端口...当您到达右侧部分时将标志设置为1,并在找到端口时退出。

mport=$(awk '/^\[MySQL\]/{f=1} f==1&&/^port/{print $3;exit}' "${CONFIG}")
sport=$(awk '/^\[Server\]/{f=1} f==1&&/^port/{print $3;exit}' "${CONFIG}")

答案 1 :(得分:3)

使用awk:

awk -F ' *= *' '$1=="user"||$1=="password"{print $2}' my.cnf
root
gogslab

答案 2 :(得分:2)

您需要搜索&#34; shell ini文件解析器&#34;。我会从这样的事情开始:

ini_get () {
    awk -v section="$2" -v variable="$3" '
        $0 == "[" section "]" { in_section = 1; next }
        in_section && $1 == variable {
            $1=""
            $2=""
            sub(/^[[:space:]]+/, "")
            print
            exit 
        }
        in_section && $1 == "" {
            # we are at a blank line without finding the var in the section
            print "not found" > "/dev/stderr"
            exit 1
        }
    ' "$1"
}

mysql_user=$( ini_get app.conf MySql user )

答案 3 :(得分:1)

我昨天遇到了类似的问题并且认为最好的解决方案可能是,如果你得到一个关联数组,比如&#34; key - value&#34;解析文件后。

我希望看到正在运行的示例看一下https://github.com/philippkemmeter/set-resolution/blob/master/set-resolution

根据您的问题,这可能会有效:

function receive_assoc_declare_statement {
    awk -F '=' 'BEGIN {ORS=" "}
    { 
        gsub(/[ \t]+/, "", $1); 
        gsub(/[ \t]+/, "", $2);
        print "[" $1 "]=" $2
    }' app.conf
}

eval 'declare -A CONF=('`receive_assoc_declare_statement`')'

然后,您可以通过${CONF[user]}访问例如用户。

gsub正在修剪键和值,因此您可以使用制表符等格式化配置文件。

它缺少部分,但您可以使用sed添加此功能,以便为每个部分创建一个配置数组:

sed -n '/\[MySql\]/, /\[/ {p}' test.removeme | sed '1 d; $ d'

总而言之,回答你的问题,这个脚本可能有效:

MYSQL=`sed -n '/\[MySql\]/, /\[/ {p}' app.conf | sed '1 d; $ d' | awk -F '=' 'BEGIN {ORS=" "}
{
    gsub(/[ \t]+/, "", $1); 
    gsub(/[ \t]+/, "", $2);
    print "[" $1 "]=" $2
}' `
eval 'declare -A MYSQL=('$MYSQL')'

其他部分相应。

相关问题