我对bash脚本还很陌生。我有一个脚本,我想在一个单独的配置文件中提取特定行的部分值,然后将该值作为脚本中的变量使用。例如:
名为config.cfg的文件中的第75行
“ssl_证书位置=/etc/ssl/证书/证书服务器”
我只想在脚本中使用“thecert.cer”末尾的值。我已经尝试了awk和grep的各种用法,但我不能完全得到证书的名称。
任何帮助都将不胜感激。谢谢
以下是我运行的命令的一些示例:
awk -F "/" '{print $4}' config.cfg
grep -o *.cer config.cfg
是否可以提取该行上的值,然后编辑输出,使其仅包含证书文件的名称?
2条答案
按热度按时间wswtfjt71#
这是
basename
基本功能的纯Bash版本:这将删除最后一个斜杠之前的所有内容。它假定您已经阅读了这一行。
或者,使用
sed
:或
这将根据行号或设置名称获取指定行,并将最后一个斜杠之前的所有内容都替换为空。它将忽略文件中的所有其他行(除非在文本匹配版本中重复了该设置)。文本匹配版本更好,因为无论设置在哪个行号上都有效。
grep
使用正则表达式(如sed
)。您的命令中的grep
命令似乎有一个不起作用的glob表达式。使用grep
(GNUgrep
)的一种方法是使用PCRE功能(Perl兼容正则表达式):这与
sed
命令类似。我已经将正则表达式锚定到行首。如果可能有白色(行可能缩进),请更改正则表达式,使其看起来像这样:
它对缩进行和非缩进行都有效。
jdgnovmf2#
有许多变体,但对于
grep
,我们想到的一个简单的变体是首先获取该行,然后只匹配该行末尾的非斜杠:为什么grep命令(
grep -o *.cer config.cfg
)工作吗?因为*.cer
是一个shell glob模式,并且会被shell扩展到匹配的文件名,甚至在grep
进程启动之前。如果没有匹配的文件,它将被逐字传递,但是正则表达式中的*
是一个量词,它需要一个前置表达式。正则表达式中的.
是“匹配任何单个字符”。所以你想要的可能是grep -o '.*\.cer'
,但是.*
匹配任何内容,包括斜杠。awk解决方案如下所示:
它使用“/”作为分隔符,仅查找以“ssl_cert_location”开头的行,然后从该行打印最后一个(
NF
)字段。或者等效的sed解决方案,它匹配同一行,然后删除所有内容,包括最后一个斜杠:
要将任何命令的输出存储在变量中,请使用命令替换: