linux Bash脚本-从另一个文件中获取文本行的一部分

r7knjye2  于 2022-11-22  发布在  Linux
关注(0)|答案(2)|浏览(153)

我对bash脚本还很陌生。我有一个脚本,我想在一个单独的配置文件中提取特定行的部分值,然后将该值作为脚本中的变量使用。例如:
名为config.cfg的文件中的第75行
“ssl_证书位置=/etc/ssl/证书/证书服务器”
我只想在脚本中使用“thecert.cer”末尾的值。我已经尝试了awk和grep的各种用法,但我不能完全得到证书的名称。
任何帮助都将不胜感激。谢谢
以下是我运行的命令的一些示例:

awk -F "/" '{print $4}' config.cfg
grep -o *.cer config.cfg

是否可以提取该行上的值,然后编辑输出,使其仅包含证书文件的名称?

wswtfjt7

wswtfjt71#

这是basename基本功能的纯Bash版本:

cert=${line##*/}

这将删除最后一个斜杠之前的所有内容。它假定您已经阅读了这一行。
或者,使用sed

cert=$(sed -n '75s/^.*\///p' filename)

cert=$(sed -n '/^ssl_cert_location=/s/^.*\///p' filename)

这将根据行号或设置名称获取指定行,并将最后一个斜杠之前的所有内容都替换为空。它将忽略文件中的所有其他行(除非在文本匹配版本中重复了该设置)。文本匹配版本更好,因为无论设置在哪个行号上都有效。
grep使用正则表达式(如sed)。您的命令中的grep命令似乎有一个不起作用的glob表达式。使用grep(GNU grep)的一种方法是使用PCRE功能(Perl兼容正则表达式):

cert=$(grep -Po '^ssl_cert_location=.*/\K.*' filename)

这与sed命令类似。
我已经将正则表达式锚定到行首。如果可能有白色(行可能缩进),请更改正则表达式,使其看起来像这样:

^[[:space:]]*ssl_cert_location=

它对缩进行和非缩进行都有效。

jdgnovmf

jdgnovmf2#

有许多变体,但对于grep,我们想到的一个简单的变体是首先获取该行,然后只匹配该行末尾的非斜杠:

<config.cfg grep '^ssl_cert_location=' | grep -o '[^/]*$'

为什么grep命令(grep -o *.cer config.cfg)工作吗?因为*.cer是一个shell glob模式,并且会被shell扩展到匹配的文件名,甚至在grep进程启动之前。如果没有匹配的文件,它将被逐字传递,但是正则表达式中的*是一个量词,它需要一个前置表达式。正则表达式中的.是“匹配任何单个字符”。所以你想要的可能是grep -o '.*\.cer',但是.*匹配任何内容,包括斜杠。
awk解决方案如下所示:

awk -F/ '/^ssl_cert_location=/{print $NF}' config.cfg

它使用“/”作为分隔符,仅查找以“ssl_cert_location”开头的行,然后从该行打印最后一个(NF)字段。
或者等效的sed解决方案,它匹配同一行,然后删除所有内容,包括最后一个斜杠:

sed -n '/^ssl_cert_location=/s#^.*/##p' config.cfg

要将任何命令的输出存储在变量中,请使用命令替换:

var="$(command with arguments)"

相关问题