2014-11-03 4 views
0

Я переместил свой сервер на новый (более дешевый). Оба имеют один и тот же Linux (CentOS) в разных версиях (5.0 и 6.5). У меня есть скрипт, который фильтрует строки из журнала:Регулярное выражение не соответствует, не знаю почему

if [ -f $URLFILE ] 
then 
    echo "File found, getting userinfo..." 
    while read line; 
    do 
    if [[ $line =~ ".Userlist: .*" ]] 
    then 
     echo "Found user information." 
     echo $line > /home/....net.txt; 
... 

Итак, если красная линия соответствует регулярному выражению, она должна быть эхом в файл. Это отлично работает в старой системе, но регулярное выражение не соответствует новой системе (без каких-либо других изменений). Регулярное выражение правильное, насколько мне подсказывает тег регулярного выражения в Интернете.

+0

Какую версию 'bash' (который я предполагаю, это оболочка, которую Вы используются) на каждой машине? – chepner

ответ

1

Есть 2 проблемы:

  1. sh не поддерживает регулярные выражения, используя =~ как bash
  2. Regex НЕ должны быть указаны и ваша переменная предпочтительно должна быть указана.

Вы можете использовать это в BASH:

if [[ "$line" =~ Userlist:[[:blank:]] ]] 

ИЛИ просто избегать использования регулярных выражений вообще и использовать glob matching:

if [[ "$line" == *"Userlist: "* ]] 
+0

Спасибо, это помогло! Я до сих пор не понимаю, почему он работал на старом сервере в течение многих лет, но я, вероятно, никогда не узнаю ... – WarWolfen

+0

На самом деле я знаю, почему это сработало бы на старой системе. Это связано с тем, что более старая версия BASH, например. 3.1, используемый для работы с цитированной строкой регулярного выражения. Вот почему новые версии BASH имеют специальную переменную 'compat31', чтобы заставить ее вести себя как более старая. – anubhava

Смежные вопросы