Grep correspondência negativa de múltiplos padrões

11

Portanto, eu tenho um monte de logs do Apache usando o formato de log padrão. Quero obter todas as linhas de log que não vieram de um rastreador da Web.

Então, digamos que eu tenha um arquivo robot_patterns com entradas como

Googlebot
msnbot-media
YandexBot
bingbot

Se eu executar o comando grep -f robot_patterns *.log , receberei todas as entradas de bots correspondentes aos padrões acima. Minha lista atual tem ~ 30 entradas de bots e agentes que desejo ignorar.

Mas quero encontrar todas as entradas que NÃO são de bots . Então eu tento grep -v -f robot_patterns *.log e nenhum resultado é retornado pelo grep. Isso não é o que eu espero ou desejo, e não estou encontrando uma maneira óbvia de conseguir o que quero. Ao usar a opção -v combinada com vários padrões em um arquivo, o grep retornará apenas uma linha correspondente se corresponder a CADA padrão.

    
por Zoredache 12.12.2013 / 00:31

2 respostas

8

Se houver uma linha vazia no arquivo de padrões, ela corresponderá a todas as linhas, fazendo com que nenhuma linha seja retornada com -v . Isso ocorre porque as linhas são interpretadas como expressões regulares e uma expressão regular vazia sempre corresponderá.

Este não é um problema com -F , porque grep ignora linhas vazias com -F .
-F faz com que grep interprete as linhas como strings simples para procurar e pode acelerar up grep se expressões regulares não forem necessárias.

    
por 12.12.2013 / 01:15
8

Você pode tentar:

grep -vE 'Googlebot|msnbot-media|YandexBot|bingbot' yourlogfile
    
por 29.10.2015 / 10:42

Tags