【问题标题】:How to read a value from .cnf file?如何从 .cnf 文件中读取值?
【发布时间】:2014-08-13 23:43:24
【问题描述】:

从 .cnf 文件中读取值的高效 bash 命令是什么?我特别想从 /etc/mysql/debian.cnf 返回第一个密码值,如下所示:

[client]
host     = localhost
user     = debian-sys-maint
password = foo
socket   = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host     = localhost
user     = debian-sys-maint
password = foo
socket   = /var/run/mysqld/mysqld.sock
basedir  = /usr

【问题讨论】:

    标签: bash


    【解决方案1】:

    例如,您可以这样做:

    $ awk '/^password/ {print $3; exit}' file
    foo
    

    它会查找以“密码”开头的行(为避免注释行,以# 开头),一旦找到,就会在其上打印第三个字段。然后,它退出;这样,您将只有一个输出(或者没有,如果没有行匹配此模式)。

    将其存储在变量中:

    $ mypass=$(awk '/^password/ {print $3; exit}' file)
    $ echo "$mypass"
    foo
    

    你也可以这样用:

    awk '/^password/ {split($0, a, "="); gsub(/^[ \t]+|[ \t]+$/, "", a[2]); print a[2]; exit}' file
    

    它匹配以password 开头的行,根据= 字段对其进行切片并打印第二个字段。这样,password=hello 也可以工作,也就是说,尾随空格不会干扰最终的解决方案。

    【讨论】:

    • 至于第三种解决方案,您也可以按照awk -F'=' '$1 ~ "^password" { print $2 ; exit }' file | tr -d "\"'\t " 的方式进行操作。这样可能会更容易看到发生了什么,据我所知,您并不依赖于拥有gawk(但现在您需要tr)。我无法谈论与您提出的解决方案相比的稳健性,因此我不打算编辑。
    • 听起来不错,@SteenSchütt 它比我在这里做的 gsub-fu 更具可读性。如果您愿意,可以随意编辑它!
    【解决方案2】:

    使用 sed:

    sed -n '/^password /{s/.*= *//p;q}' /etc/mysql/debian.cnf
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 2012-03-04
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      相关资源
      最近更新 更多