Estoy buscando una expresión regular que pueda usar para buscar errores HTTP en mis archivos de registro estándar de Apache.
Me interesa hacer coincidir todas las líneas quenotener un estado de devolución HTTP 200 o HTTP 204.
Puedo unir las líneas quehacercontener código de retorno HTTP 204 o HTTP 200
grep 'HTTP[^"]*" 204 \| HTTP[^"]*" 200'
Pero me gustaría tener lo contrario. También estoy seguro de que la expresión anterior se puede optimizar.
Necesito enviar dicha expresión regular a un programa externo, por lo que usarla grep -v
para invertirla no es una opción.
Respuesta1
Las expresiones regulares ordinarias no incluyen una forma de negar nada excepto un solo carácter, por lo que creo que tendrás que proporcionar la lista completa de códigos que deseas:
HTTP[^"]*" (1|20[12356]|3|4|5)
Los RE compatibles con Perl le permiten negar cadenas de texto, por lo que si los estuviera usando, podría usar
HTTP[^"]*" (?!(200|204))
Respuesta2
El -v
modificador te proporciona todas las líneas que no coinciden, entonces:
egrep -v 'HTTP[^"]*" (200|204)'