Bash:在搜索模式中用通配符替换部分字符串

时间:2015-11-06 16:05:22

标签: bash

我有工作脚本在日志文件中查找错误:

CONFIGFILE=testfmc.ini
log=log1.log
res=0
while read line ;
    do
    echo "$line"
    if [[ "$line" == PAT[0-9][0-9]* ]] ; then
    echo "line --$line--"
    patnum=$(echo "$line" | awk -F= '{print $1}');
    pattern=$(echo "$line" | awk -F= '{print $2}');
    echo "$patnum   ---   $pattern";
    res=$(fgrep -c "$pattern" $log );
        if [[ "$res" -gt 0 ]] ; then 
        echo "Error in log files $res";
        fi
    echo "End of IF";
fi
echo  $res;
done < $CONFIGFILE

testfmc.ini是带有模式的文件:

PAT01=java.net.SocketException: Connection reset
PAT02=javax.mail.StoreClosedException: failed to create new store connection
PAT03=javax.mail.MessagingException: ServerName NO Server Unavailable
PAT04=javax.mail.FolderClosedException: * BYE Connection is closed

问题是在PAT03中有一个服务器名称,此错误可能会显示多个服务器名称。如何使用WILDCARD替换模式中的ServerName。我试过用*或*或&#34; *&#34;和其他几个选项,但没有任何作用。

3 个答案:

答案 0 :(得分:2)

使用参数扩展可以轻松完成所需的操作(用通配符替换字符串的一部分):

s='PAT03=javax.mail.MessagingException: ServerName NO Server Unavailable'
s2="${s//ServerName/'*'}"
echo "$s2"

(整个脚本存在其他问题 - fgrep与文字字符串匹配,而不是正则表达式或glob样式模式,其他grep变体使用正则表达式,而此处的模式为glob风格 - 但如果您的预期问题的范围超出了标题中的范围,您应该直接在点上提出一个新问题,而不是将您真正想知道的内容完全转移到另一个问题的详细信息中。)

答案 1 :(得分:0)

我不认为你可以使用fgrep来做到这一点。我以为fgrep只查找字符串,而不是模式。

也许使用普通grepegrep,并将模式设为.*而不是*

PS @Charles关于IFS的建议很棒。

答案 2 :(得分:0)

ini文件中的

替换:

PAT03=javax.mail.MessagingException: ServerName NO Server Unavailable

PAT03=javax.mail.MessagingException: .* NO Server Unavailable

在脚本替换中:

res=$(fgrep -c "$pattern" $log );

使用:

res=$(grep -E "$pattern" $log );

脚本没有得到很好的优化,但工作原理:)祝你好运