2017-02-22 61 views
2

一個字我有一個CSV被讀入具有短語的腳本:bash腳本來匹配使用正則表達式

This port supports SSLv3/TLSv1.0. 
This port supports TLSv1.0/TLSv1.1/TLSv1.2. 
This port supports TLSv1.2. 

什麼我希望做的是設置在字/數正則表達式的變量: TLSv1.0 然後在IF/Then語句中引用該變量。這個問題我是 得到正則表達式來看TLSv1.0。有人可以幫我 使用我的BASH腳本來查看TLSv1.0是否在以「此端口支持」開頭的行中?

#!/bin/sh 
REGEX="\TLSv1.0\" 

cat filename.csv | awk -F"," '{gsub(/\"/,"",$4);print $5}' | sed s/\"//g | 
while IFS=" " read pluginoutput 
do 

if [[ "$pluginoutput" =~ $REGEX ]]; then 
. 
. rest of my code 
. 

你可以看到我試圖在變量中設置正則表達式,但它只是不工作。顯然是一個錯字或什麼的。有沒有人有正則表達式的建議?

謝謝,

+1

什麼與文字引號?你正在告訴shell在被搜索的字符串中尋找''''s **,但是它們顯然沒有出現。# –

+0

另外,'#!/ bin/sh'是POSIX sh,而不是bash。如果你想使用bash特性,可以使用bash:'#!/ bin/bash'。 –

+1

此外,'cat filename | awk ...'效率低於awk ...

回答

4

這裏有很多錯誤。挑選一些關鍵的:

  • #!/bin/sh指定您希望您的腳本與POSIX兼容的解釋來解釋,但沒有指定哪一個。其中很多,如ashdash,沒有[[ ]],=~或您的代碼依賴的其他擴展。改爲使用#!/bin/bash
  • REGEX="\TLSv1.0\"中," s是數據,而不是語法。這意味着當你做[[ $string =~ $regex ]]時,它們就是要搜索的內容的一部分。相比之下,regex=TLSv1.0regex="TLSv1.0"regex='TLSv1.0'都將具有相同的效果,即將TLSv1.0指定爲regex變量的內容。

    這就是說,作爲正則表達式的語法點,你可能想regex='TLSv1[.]0' - 這樣只會匹配.,而不是治療點作爲匹配任何字符通配符(因爲它是在regular-表達式語法)。

就個人而言,我可能會做一些更象下面(如果我有一個理由這樣做在bash解析,而不是讓一個egrep通話過程中所有的輸入):

#!/bin/bash 
regex='(^|,)"?This port supports .*TLSv1[.]0.*[.]"?($|,)' 
while IFS= read -r line; do 
    [[ $line =~ $regex ]] && echo "Found TLSv1.0 support" 
done 
+0

感謝查爾斯,這工作 – Alby