我刚开始学习 shell 脚本。我有一个名为 app.conf
的文件,内容如下:
[MySql]
user = root
password = root123
domain = localhost
database = db_name
port = 3306
[Logs]
level = logging.DEBUG
[Server]
port = 8080
我想在shell脚本中解析这个文件,并从中提取mysql凭据。 我该如何实现?
我刚开始学习 shell 脚本。我有一个名为 app.conf
的文件,内容如下:
[MySql]
user = root
password = root123
domain = localhost
database = db_name
port = 3306
[Logs]
level = logging.DEBUG
[Server]
port = 8080
我想在shell脚本中解析这个文件,并从中提取mysql凭据。 我该如何实现?
我会这样做:
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个字段。
编辑内容:
如果您要从配置文件中解析一堆值,我建议先将配置文件名赋值给一个变量:
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}")
var=value
中,并且$n
会给我提供由正则表达式匹配到的一行中以空格分隔的第n部分。另外,$0
会给我提供匹配到的整行内容。 - exAres您需要搜索“shell ini文件解析器”。我建议从以下内容开始:
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 )
使用awk:
awk -F ' *= *' '$1=="user"||$1=="password"{print $2}' my.cnf
root
gogslab
=
,两侧可以选择性地加上空格。一旦字段被分隔,它会在第一个字段为user
或password
时打印第二个字段。 - anubhava我昨天遇到了类似的问题,认为最好的解决方案是,在解析文件后获得一个“键-值”形式的关联数组。
如果您想看一个运行示例,请查看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会修剪键和值,以便您可以使用tab等格式化配置文件。
它缺少部分功能,但是您可以使用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')'
/bin/sh
。 - exAres