Grep log para determinada palavra somente se seguida por outra palavra

0

Eu tenho um arquivo de log com entradas como as seguintes:

Entrada

php notice bob
php notice winner
php notice blah winner
php notice asfsdf test
php erro)r bob                                                                                                
php error winner
php error trash winner
php error junk test
print this line

Saída

php notice winner
php notice blah winner                                                                                        
php error winner
php error trash winner
print this line

O que estou tentando fazer é corresponder todas as linhas de um arquivo de log, a menos que ele contenha php seguido por error ou notice . Se ele contiver php seguido por error ou notice , só deverá coincidir se winner também estiver na sequência. Meu regex-foo é fraco. Obrigado.

    
por Brian 30.08.2011 / 03:55

2 respostas

1

Use isto: grep 'php\s\+\(error\|notice\).*winner' mylogfile

    
por 30.08.2011 / 19:18
0

Pode haver uma maneira de fazer com que o grep retire isso em uma string, mas acho que, pessoalmente, eu faria script para lidar com isso em perl ou bash. No bash seria algo como

while read line
do
# If line contains "php error" or "php notice" and "winner", print it, else skip it
   if echo $line | grep "php error" >/dev/null  || echo $line | grep -q "php notice" >/dev/nulll; then
       if echo $line | grep "winner" > /dev/null; then
           echo $line
       fi
   else 
   # If line does not contain "php error" or "php notice", print it.
       echo $line
   fi
done

Eu não tenho um sistema prático para testar / depurar isso agora, então você pode ter que ajustar um pouco.

    
por 30.08.2011 / 05:08

Tags