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 *.logy 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 -vopció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á.-FSin embargo, esto no es un problema porquegrepignora las líneas vacías con-F.-Fhacegrepque interprete las líneas como cadenas simples para buscar y puede acelerargrepsi no se necesitan expresiones regulares.fuente
fgrepignorando 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