online - grep regex starts with
Grep regex que NO contiene cadena (3)
Estoy pasando una lista de patrones regex a grep
para grep
con un archivo syslog. Por lo general, coinciden con una dirección IP y 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 lo contrario de lo anterior, un NO coincide líneas con una cierta dirección IP y el error por lo que "! 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 ha explotado . Debo poder incluir una IP para NO coincidir.
He visto varias publicaciones similares en StackOverflor, pero utilizan patrones de expresiones regulares que parece que no puedo usar grep
. ¿Alguien puede 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
grep
coincide, grep -v
hace lo contrario. Si necesita "emparejar A pero no B", generalmente utiliza tuberías:
grep "${PATT}" file | grep -v "${NOTPATT}"
(?<!1/.2/.3/.4).*Has exploded
Necesita ejecutar esto con -P para tener un 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 un lookbehind negativo para ignorar la línea si está precedido por 1.2.3.4
. ¡Espero que ayude!
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 el 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"