2015-11-06 4 views
0

Я рабочий скрипт, который ищет ошибки в лог-файлах: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. Я пробовал с * или * или "*" и еще несколько вариантов, но ничего не работает.

+0

Что вы на самом деле пытаетесь достичь с этим кодом? С описанием на английском языке было бы легче работать. –

+1

Если «ServerName» никогда не имеет смысла (т. Е. Вы не хотите поймать только те вещи, которые могут быть именами серверов, а также не извлекать их после сопоставления), вы должны действительно изменить файл шаблона – Aaron

+2

Кстати - все ' awk -F = 'глупо. Гораздо эффективнее использовать 'while IFS =" = "read -r patnum pattern' для чтения непосредственно в нужные вам переменные. –

ответ

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);

сценарий не очень хорошо оптимизирован, но работает так :) удачи

+0

Спасибо, может быть единственная комбинация, с которой я не пытался был. * Прекрасно работает. – Todoroff

+0

Давать ему то, что ему нужно, а не то, что он просил? Как мы можем заставить людей задавать хорошие вопросы, если мы это сделаем? :) –

+0

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

2

Желаемая работа (замена часть строки с групповым символом) тривиально делается с расширением параметра:

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

(Есть и другие проблемы, связанные с вашим сценарием в целом - fgrep матчей буквальных строк , а не регулярные выражения или шаблоны стиля glob, а другие варианты grep используют регулярные выражения, в то время как ваши шаблоны здесь являются glob-style, но если область вашего предполагаемого вопроса расширяется за пределы того, что находится в заголовке, вы должны задать новый вопрос непосредственно в точке а не сползать то, что вы на самом деле хотите узнать в деталях другого вопроса).

0

Я не думаю, что вы можете использовать fgrep для этого. Я думал, что fgrep ищет только строки, а не шаблоны.

Возможно использование обычного grep или egrep, и положите образец как .*, а не *.

PS @Charles предложение относительно IFS это здорово.

+0

Если я использую grep или egrep, PAT04 не будет работать. – Todoroff

+0

хорошо, что вы не можете получить свой торт и съесть его! Возможно, вам нужно '\ *' в PAT04. Вы называете их «шаблонами», поэтому я не ожидал, что они будут литералами - я бы ожидал, что такие вещи, как '*', будут процитированы. –

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