使用REGEX匹配单词的BASH脚本

时间:2017-02-22 18:11:56

标签: regex bash csv

我将CSV读入包含以下短语的脚本:

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

我要做的是在单词/数字上设置REGEX变量: 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 个答案:

答案 0 :(得分:4)

这里有很多错误。选择一些关键的:

  • #!/bin/sh指定您希望使用符合POSIX的解释器解释您的脚本,但不指定哪一个。其中许多内容(例如ashdash)不具有[[ ]]=~或您的代码所依赖的其他扩展程序。请改用#!/bin/bash
  • REGEX="\TLSv1.0\"中,"数据,而不是语法。这意味着,当您执行[[ $string =~ $regex ]]时,它们将成为所搜索内容的一部分。相比之下,regex=TLSv1.0regex="TLSv1.0"regex='TLSv1.0'将具有相同的效果,即将TLSv1.0指定为regex变量的内容。

    那就是说,作为正则表达式语法的一个要点,你可能想要regex='TLSv1[.]0' - 这样它只会匹配.,而不是将点视为匹配任意字符的通配符(因为它是正则表达式语法)。

就个人而言,我可能会做更多类似下面的事情(如果我有理由在bash中进行解析而不是让一个egrep调用处理所有输入):

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