2017-02-22 163 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