Estoy pasando una lista de patrones regex grep
para verificar en 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 "1\.2\.3\.4.*Has exploded"
parte 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 con las líneas con una determinada dirección IP y 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 . Yo debo ser capaz de incluir una IP a no coinciden.
He visto varias publicaciones similares en StackOverflor, sin embargo, usan patrones de expresiones regulares con las que parece que no puedo trabajar grep
. ¿Alguien puede proporcionar un ejemplo de trabajo por grep
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
patterns[3]="\!9\.10\.11\.12.*Has exploded"
cambiospatterns[3]="(?<!9\.10\.11\.12).*Has exploded"
y losgrep "${patterns[$i]}" logfile.log
cambios engrep -P "${patterns[$i]}" logfile.log
PCRE asumen más metacaracteres de forma predeterminada, por lo que algunos de los escapes pueden necesitar eliminarse de otras expresiones coincidentes.Respuestas:
grep
coincide,grep -v
hace lo contrario. Si necesita "hacer coincidir A pero no B", generalmente usa tuberías:fuente
-v
y puede usarlo en un bucle. Quizás necesite ser más específico acerca de sus limitaciones, o quizás tenga una idea errónea sobre cómo debería funcionar su script. Intenta publicar un código.Debe ejecutar esto con -P para tener una mirada negativa hacia atrás (expresión regular de Perl), por lo que el comando es:
Prueba esto. Utiliza una mirada hacia atrás negativa para ignorar la línea si está precedida por
1.2.3.4
. ¡Espero que ayude!fuente
grep
no es compatible con la búsqueda. A menos que esté usando Gnugrep
y use el--P
parámetro para que use un motor PCRE.grep -P '(?<!1\.2\.3\.4) Has exploded' test.log
tenga en cuenta que el aspecto posterior solo funciona en los caracteres que preceden inmediatamente a la parte coincidente de la expresión, por lo que si hay otras cosas entre la dirección y el mensaje, por ejemplo1.2.3.4 FOO Has exploded
, esto no funcionará..*
mirada negativa posterior, ya que su ejemplo también lo tiene, imagino que podría haber otro texto en el medio.debería ser lo mismo que
fuente