Bash
如果後面跟著特定的行,如何驗證行?
在我們的一些 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