[英]compare regex with grep output - bash script
我嘗試使用 grep grep "^PASS_MAX_DAYS" /etc/login.defs
在文件中找到單詞“PASS_MAX_DAYS”,然后將其保存在一個變量中,並將其與值為 90 或更小的正則表達式進行比較。
regex = "PASS_MAX_DAYS\s*([0-9]|[1-8][0-9]|90)"
grep output 是:PASS_MAX_DAYS 120
所以我的 function 應該打印失敗,但是它匹配:
function audit_Control () {
if [[ $cmd =~ $regex ]]; then
echo match
else
echo fail
fi
}
cmd=`grep "^PASS_MAX_DAYS" /etc/login.defs`
regex="PASS_MAX_DAYS\s*([0-9]|[1-8][0-9]|90)"
audit_Control "$cmd" "$regex"
問題是 bash 測試[[
使用正則表達式匹配運算符=~
不支持常見的轉義符,例如\s
表示空白或\W
表示非單詞字符。
它確實支持 posix 預定義字符類,因此您可以使用[[:space:]]
代替\s
你的正則表達式將是:
regex="PASS_MAX_DAYS[[:space:]]*([0-9]|[1-8][0-9]|90)"
您可能想要添加錨點^
和$
以確保整行匹配,那么正則表達式是regex="^PASS_MAX_DAYS[[:space:]]*([0-9]|[1-8][0-9]|90)$"
如果沒有行尾錨點,您可以匹配匹配后具有尾隨數字的行,因此PASS_MAX_DAYS 9077
將匹配PASS_MAX_DAYS 90
並且尾隨“77”不會阻止匹配。
這個答案還有一些關於 bash 的[[ ]]
使用=~
運算符構造的非常有用的信息。
我相信您的正則表達式有問題,請嘗試該版本:
PASS_MAX_DAYS\s*([0-9]|[1-8][0-9]|90)$
[lucas@lucasmachine ~]$ cat test.sh
#!/bin/bash
function audit_Control () {
if [[ $cmd =~ $regex ]]; then
echo match
else
echo fail
fi
}
regex="PASS_MAX_DAYS\s*([0-9]|[1-8][0-9]|90)$"
audit_Control "$cmd" "$regex"
[lucas@lucasmachine ~]$ export cmd="PASS_MAX_DAYS 123"
[lucas@lucasmachine ~]$ ./test.sh
fail
[lucas@lucasmachine ~]$ export cmd="PASS_MAX_DAYS 1"
[lucas@lucasmachine ~]$ ./test.sh
match
我可以解釋這個問題是另一個正則表達式沒有檢查行尾,所以,你匹配的是“PASS_MAX_DAYS 1”23,所以 23 沒有被“計算”到你的正則表達式中。 您的正則表達式確實匹配了文本的一部分。現在,對於行尾,它應該與 1 位數字完全匹配,找到行尾,或 [1-8][0-9] 行尾或 90 行尾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.