2017-02-22 34 views
2

У меня есть CSV считывания в сценарий, который имеет фразы:BASH скрипт, чтобы соответствовать слову с помощью Regex

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

Что такое с буквальными цитатами? Вы говорите оболочке искать '' 's ** внутри ** искомую строку, но они явно не отображаются. –

+0

Кроме того,' #!/Bin/sh' - это POSIX sh, а не bash. Если вы хотите использовать bash, используйте bash: '#!/Bin/bash'. –

+1

Кроме того,' cat filename | awk ... 'менее эффективно, чем' awk ...

ответ

4

Есть много вещей, которые здесь не так. Для того, чтобы выбрать некоторые ключевые из них:

  • #!/bin/sh указывает, что вы хотите, чтобы ваш скрипт должен интерпретироваться с POSIX-совместимый интерпретатор, но не определяет, какой из них. Многие из них, например ash или dash, не имеют [[ ]], =~ или других расширений, от которых зависит ваш код. Вместо этого используйте #!/bin/bash.
  • В REGEX="\TLSv1.0\", " s находятся данные, а не синтаксис. Это означает, что они являются частью поиска контента, когда вы делаете [[ $string =~ $regex ]]. В отличие от этого, regex=TLSv1.0, regex="TLSv1.0" или regex='TLSv1.0' будут иметь одинаковый эффект, назначая TLSv1.0 как содержимое переменной regex.

    Это, как точка синтаксиса регулярных выражений, вы, вероятно, хотите regex='TLSv1[.]0' - таким образом он будет соответствовать только ., в отличие от обработки точки в качестве шаблона match-any-character (как в обычном, синтаксис выражения).

Лично я мог бы сделать что-то больше похоже на следующее (если у меня была причина, чтобы сделать синтаксический анализ в Баш вместо того, чтобы позволить единый процесс 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