Regex Grep QUE NO contiene cadena


Estoy pasando una lista de patrones regex a grep para cotejarlos con un archivo syslog. Por lo general, coinciden con una dirección IP y una entrada de registro;

grep "1\.2\.3\.4.*Has exploded" syslog.log

Es solo una lista de patrones como la parte "1\.2\.3\.4.*Has exploded" que estoy pasando, en un bucle, por lo que no puedo pasar "-v", por ejemplo.

Estoy confundido tratando de hacer la inversa de lo anterior, un NO coincide con las líneas con una cierta dirección IP y error así"!1.2.3.4.* Ha explotado " coincidirá con las líneas de syslog para cualquier cosa que no sea 1.2.3.4 diciéndome que tiene explotar. I debe ser capaz de incluir una IP para NO coincidir.

He visto varias publicaciones similares en StackOverflor, sin embargo, usan patrones de expresiones regulares con los que parece que no puedo trabajar grep. ¿Puede alguien proporcionar un ejemplo de trabajo para grep por favor?

ACTUALIZACIÓN: Esto está sucediendo en un script como este;

patterns[1]="1\.2\.3\.4.*Has exploded"
patterns[2]="5\.6\.7\.8.*Has died"
patterns[3]="\!9\.10\.11\.12.*Has exploded"

for i in {1..3}
do
 grep "${patterns[$i]}" logfile.log
done
 121
Author: jwbensley, 2012-05-02

3 answers

grep coincide, grep -v hace el inverso. Si necesita "coincidir con A pero no con B", generalmente usa tuberías:

grep "${PATT}" file | grep -v "${NOTPATT}"
 216
Author: beerbajay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-02 10:10:13
(?<!1\.2\.3\.4).*Has exploded

Necesita ejecutar esto con-P para tener lookbehind negativo (expresión regular de Perl), por lo que el comando es:

grep -P '(?<!1\.2\.3\.4).*Has exploded' test.log

Prueba esto. Utiliza lookbehind negativo para ignorar la línea si es precedida por 1.2.3.4. Espero que ayude!

 12
Author: Neil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-02 13:07:56
patterns[1]="1\.2\.3\.4.*Has exploded"
patterns[2]="5\.6\.7\.8.*Has died"
patterns[3]="\!9\.10\.11\.12.*Has exploded"

for i in {1..3}
 do
grep "${patterns[$i]}" logfile.log
done

Debe ser lo mismo que

egrep "(1\.2\.3\.4.*Has exploded|5\.6\.7\.8.*Has died)" logfile.log | egrep -v "9\.10\.11\.12.*Has exploded"    
 2
Author: krecker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-05 15:11:53