Bash

如果後面跟著特定的行,如何驗證行?

  • November 12, 2020

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

您可以通過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

引用自:https://unix.stackexchange.com/questions/619105