その行が次の場合、特定の行をどのように確認できますか?

その行が次の場合、特定の行をどのように確認できますか?

一部の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コマンドに。


一度だけ表示するには、-cgrepオプションを追加して確認します。

[[ $(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

関連情報