我有工作脚本在日志文件中查找错误:
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;和其他几个选项,但没有任何作用。
答案 0 :(得分:2)
使用参数扩展可以轻松完成所需的操作(用通配符替换字符串的一部分):
s='PAT03=javax.mail.MessagingException: ServerName NO Server Unavailable'
s2="${s//ServerName/'*'}"
echo "$s2"
(整个脚本存在其他问题 - fgrep
与文字字符串匹配,而不是正则表达式或glob样式模式,其他grep变体使用正则表达式,而此处的模式为glob风格 - 但如果您的预期问题的范围超出了标题中的范围,您应该直接在点上提出一个新问题,而不是将您真正想知道的内容完全转移到另一个问题的详细信息中。)
答案 1 :(得分:0)
我不认为你可以使用fgrep来做到这一点。我以为fgrep
只查找字符串,而不是模式。
也许使用普通grep
或egrep
,并将模式设为.*
而不是*
。
PS @Charles关于IFS
的建议很棒。
答案 2 :(得分:0)
替换:
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 );
脚本没有得到很好的优化,但工作原理:)祝你好运