簡體   English   中英

將正則表達式與 grep output - bash 腳本進行比較

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM