해당 줄이 뒤에 오는 경우 특정 줄을 어떻게 확인할 수 있습니까?

해당 줄이 뒤에 오는 경우 특정 줄을 어떻게 확인할 수 있습니까?

일부 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

관련 정보