Así que tengo un montón de registros de Apache con el uso del formato de registro estándar. Quiero obtener todas las líneas de registro que no provienen de un rastreador web.
Digamos que tengo un archivo robot_patterns con entradas como
Googlebot
msnbot-media
YandexBot
bingbot
Si ejecuto el comando grep -f robot_patterns *.log
, obtendré todas las entradas de bots que coincidan con los patrones anteriores. Mi lista actual tiene ~ 30 entradas de bots y agentes que deseo ignorar.
Pero quiero encontrar todas las entradas que NO son de bots . Así que lo intento grep -v -f robot_patterns *.log
y grep no devuelve ningún resultado. Esto no es lo que espero o deseo, y no estoy encontrando una manera obvia de obtener lo que quiero. Al usar la -v
opción combinada con múltiples patrones en un archivo, grep solo devolverá una línea coincidente si coincide con CADA patrón.
GNU grep 2.6.3
.Respuestas:
Si hay una línea vacía en el archivo de patrones, coincidirá con cada línea, por lo que no se devolverá ninguna línea
-v
. Esto se debe a que las líneas se interpretan como expresiones regulares, y una expresión regular vacía siempre coincidirá.-F
Sin embargo, esto no es un problema porquegrep
ignora las líneas vacías con-F
.-F
hacegrep
que interprete las líneas como cadenas simples para buscar y puede acelerargrep
si no se necesitan expresiones regulares.fuente
fgrep
ignorando que la cadena vacía final era un error que se corrigió en 2.19 ( commit 2d3832e1ff772dc1a374bfad5dcc1338350cc48b , por lo que no debe confiar en él.Puedes probar:
fuente