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
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}"
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!
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"
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