2014-11-03 77 views
0

我将我的服务器移动到一个新的(更便宜)。两者都有不同版本(5.0和6.5)的Linux(CentOS)。我有一个shell脚本过滤器线路输出的日志:正则表达式不匹配,不知道为什么

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 2014-11-03 16:12:27

回答

1

有2个问题:

  1. sh不支持使用=~bash
  2. 正则表达式不应该被引用和您的变量最好被引用正则表达式匹配。

您可以在BASH使用:

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

或只是完全避免使用正则表达式,并使用glob matching

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

谢谢,这有帮助!我仍然不明白为什么它在旧服务器上工作了多年,但我可能永远不会知道...... – WarWolfen 2014-11-03 18:43:43

+0

其实我知道它为什么会在旧系统上工作。这是因为旧的BASH版本例如3.1用于引用正则表达式字符串。这就是为什么较新的BASH版本有一个名为'compat31'的特殊变量,以使其行为与旧版本相似。 – anubhava 2014-11-03 18:45:50