일부 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
명령에.
한 번만 표시되도록 하려면 -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