需要帮助读取变量

需要帮助读取变量

我目前正在熟悉 Ubuntu。我有一个处理多个 bash 文件的个人项目。

config.txt我有一个包含以下字符串的文件:

hostip="192.168.1.2"
pname="My Office"
pid="01-001"

hostip我的问题是,如果我有一个需要文件中变量的 bash 文件config.txt,如何提取192.168.1.2字符串(应从输出中删除双引号)?

答案1

您可以使用它awk来实现这一点,例如:

$ awk -F'"' '/hostip/ {print $2}' host.txt
192.168.1.2
  • -F选项决定字段分隔符
  • /hostip/确定搜索字符串
  • {print $2}确定要打印的字段

这样,您就可以从文件中获取该字符串并将其放入 bash 脚本内的变量中,例如:

hostip=$(awk -F'"' '/hostip/ {print $2}' host.txt)

答案2

使用sed

sed -n "s/hostip=\([^ ]*.*\)/\1/p" config.txt

但如果您的 config.txt 声明中包含空格,例如hostip = 192.168.1.2,请使用:

sed -n "s/hostip *= *\([^ ]*.*\)/\1/p" config.txt

最后,为了让生活更轻松,创建一个函数或包装脚本:

get_value() { 
    sed -n "s/$1 *= *\([^ ]*.*\)/\1/p" $2
}

get_value hostip config.txt
# prints 192.168.1.2
get_value pname config.txt
# prints My Office

hostip=$(get_value hostip config.txt)

答案3

使用 Raku(以前称为 Perl6)

~$ raku -ne 'put $/ if m/ <?after  hostip\= > \" <([\d**1..3 \.]**3 \d**1..3)> \" /;' config1.txt
192.168.1.2

命令-ne行标志告诉 Raku 逐行检查输入。上面的代码使用正零宽度lookbehind断言,写为<?after … >.正则表达式查找四组数字的匹配,每组数字的长度为 1 到 3 位,每组数字之间用句点分隔。该<( … )>习惯用法告诉 Raku 删除每个外部匹配并将内部匹配加载到$/返回的 match 变量中。

HTH。

https://raku.org

相关内容