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 *.log
e 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 -v
opção combinada com vários padrões em um arquivo, o grep retornará apenas uma linha correspondente se corresponder a TODOS os padrões.
GNU grep 2.6.3
.Respostas:
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
-F
entanto, isso não é um problema , porquegrep
ignora as linhas vazias com-F
.-F
fazgrep
com que interpretem as linhas como sequências simples de busca e podem acelerargrep
se expressões regulares não forem necessárias.fonte
fgrep
ignorando que arrastando string vazia era um bug que foi fixado em 2,19 ( cometer 2d3832e1ff772dc1a374bfad5dcc1338350cc48b , para que você não deve confiar nele.Podes tentar:
fonte