如果后面跟着特定的行,如何验证该行?

如果后面跟着特定的行,如何验证该行?

在我们的一些 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

相关内容