在我们的一些 Linux 服务器上,我们有以下文件:
/etc/ambari-agent/conf/ambari-agent.ini
这些文件包括以下行示例:
; memory_threshold_soft_mb=400
; memory_threshold_hard_mb=1000
; ignore_mount_points=/mnt/custom1,/mnt/custom2
[security]
force_https_protocol=PROTOCOL_TLSv1_2
keysdir=/var/lib/ambari-agent/keys
server_crt=ca.crt
passphrase_env_var_name=AMBARI_PASSPHRASE
我们想要做的是验证该行的完整匹配 -force_https_protocol=PROTOCOL_TLSv1_2
下面[security]
所以我们做了以下(这一行是 bash 脚本的一部分)
[[ ` grep -xA 0 "force_https_protocol=PROTOCOL_TLSv1_2" /etc/ambari-agent/conf/ambari-agent.ini | wc -l ` -eq 1 ]] && echo "full match"
这可行,但我们不确定我们的方法是否正确的完全匹配
我很乐意得到其他想法
目标是验证该行是否force_https_protocol=PROTOCOL_TLSv1_2
出现在 - 行之后[security]
(这是必须的),并且还需要验证该行与force_https_protocol=PROTOCOL_TLSv1_2
答案1
您可以grep
通过以下方式使用和启用 PCRE:
<infile grep -zqP '\[security\]\nforce_https_protocol=PROTOCOL_TLSv1_2\n' \
&& echo "found" || echo "not found"
如果该行不是紧随其后[security]
,只需更改
\[security\]\n
\[security\]\n.*\n
命令中的with 。
为了确保它只出现一次,您可以-c
为 grep 添加选项并验证它。
[[ $(grep -zcP '\[security\]\nforce_https_protocol=PROTOCOL_TLSv1_2\n' infile) -eq 1 ]] && echo found
或等价:
(($(grep -zcP '\[security\]\nforce_https_protocol=PROTOCOL_TLSv1_2\n' infile) == 1)) && echo found
答案2
您可以使用 gnu awk 解析该 INI 文件:
gawk '
match($0, /^\[(.+)\]$/, m) {is_security = m[1] == "security"}
is_security && $0 == "force_https_protocol=PROTOCOL_TLSv1_2" {valid=1; exit}
END {
if (valid) {print "valid"} else {print "not valid"}
exit (!valid)
}
' file.ini