Correspondência negativa de vários padrões Grep


14

Então, eu tenho vários 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 tenho 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 por 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 *.loge nenhum resultado é retornado pelo grep. Não é isso que espero ou desejo, e não estou encontrando uma maneira óbvia de conseguir o que quero. Ao usar a -vopção combinada com vários padrões em um arquivo, o grep retornará apenas uma linha correspondente se corresponder a TODOS os padrões.


Quando tentei isso no meu sistema, o grep -v -f teve o comportamento desejado, retornando apenas linhas que não correspondiam a nenhum dos padrões. Isso foi feito com (GNU grep) 2.14.56-1e3d. Qual grep você está usando?
wingedsubmariner

Estou executando GNU grep 2.6.3.
precisa

4
Fiz mais alguns testes e descobri que, 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 não é um problema com -F, no entanto, e -F pode acelerar o grep para sua tarefa - pode valer a pena tentar por você.
wingedsubmariner

Uma linha vazia à direita! Argh ... Esse parece ser o problema. Se você quiser, adicione isso como resposta.
Zoredache

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 -v. Isso ocorre porque as linhas são interpretadas como expressões regulares e uma expressão regular vazia sempre corresponderá.

No -Fentanto, isso não é um problema , porque grepignora as linhas vazias com -F.
-Ffaz grepcom que interpretem as linhas como sequências simples de busca e podem acelerar grepse expressões regulares não forem necessárias.


1
GNU fgrepignorando que arrastando string vazia era um bug que foi fixado em 2,19 ( cometer 2d3832e1ff772dc1a374bfad5dcc1338350cc48b , para que você não deve confiar nele.
Stéphane Chazelas

13

Podes tentar:

grep -vE 'Googlebot|msnbot-media|YandexBot|bingbot' yourlogfile

2
Bem-vindo ao Unix e Linux. O OP tem uma lista de aproximadamente 30 strings que ele deseja ignorar, e as quatro que ele apresentou como exemplos têm um comprimento médio de dez caracteres cada, portanto, é provável que seu comando tenha mais de 300 caracteres. É provável que seja difícil de manter (e até mesmo ler). Você pode modificar sua resposta para ser guiado pela lista de strings do OP? …………………………………………… ... PS Você notou que a resposta foi encontrada? - O OP aprendeu como fazer funcionar sua abordagem original.
G-Man Diz 'Reinstate Monica'

2
Por que avaliar negativamente minha resposta? : /
Orsius

3
Ótima resposta. Possui regex OR e a opção -vE foi útil.
Kirt Carson

3
Essa é a resposta para a pergunta que a maioria das pessoas provavelmente está tentando resolver.
Perfi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.