grep excluir várias strings


115

Estou tentando ver um arquivo de log usando cauda -fe desejo excluir todas as linhas que contêm as seguintes strings:

"Nopaging the limit is"`  and `"keyword to remove is"

Posso excluir uma string como esta:

tail -f admin.log|grep -v "Nopaging the limit is"

Mas como excluo linhas contendo string1ou string2.

Respostas:


106

Dois exemplos de filtragem de várias linhas com grep:

Coloque isso em filename.txt:

abc
def
ghi
jkl

Comando grep usando a opção -E com um tubo entre os tokens em uma string:

grep -Ev 'def|jkl' filename.txt

estampas:

abc
ghi

Comando usando a opção -v com pipe entre tokens cercados por parênteses:

egrep -v '(def|jkl)' filename.txt

estampas:

abc
ghi

15
Estou surpreso que ninguém tenha falado sobre o grep -v -e def -e jklmétodo que IMHO é mais claro…
Frizlab

4
Ou melhor ainda: o grep -Fv -e def -e jklque é ainda mais rápido!
Frizlab

11
Com o sinalizador -F, você pode usar novas linhas como delimitadores em vez de barras verticais. Isso permite o uso de saída de comando como filtro mais facilmente, por exemplo:grep -vF $(pgrep myprocess)
Phlarx

45
grep -Fv -e 'Nopaging the limit is' -e 'keyword to remove is'

-F correspondências por strings literais (em vez de regex)

-v inverte o jogo

-e permite vários padrões de pesquisa (todos literais e invertidos)


1
Esta é a resposta certa: a única que evita as várias grep -vinstâncias e o requisito artificial de uma regex (permite que várias strings sejam especificadas de forma limpa em argumentos separados). Imagine construir essa regex programaticamente em um script para strings que podem conter qualquer coisa ...
user2394284

Na verdade, nenhuma dessas é a resposta certa porque, ao passar nenhuma palavra-chave para exclusão, excluirá tudo em vez de nada.
Győri Sándor

37

Outra opção é criar uma lista de exclusões, isto é especialmente útil quando você tem uma longa lista de itens a serem excluídos.

vi /root/scripts/exclude_list.txt

Agora adicione o que você gostaria de excluir

Nopaging the limit is
keyword to remove is

Agora use grep para remover linhas de seu arquivo de log de arquivo e ver as informações não excluídas.

grep -v -f /root/scripts/exclude_list.txt /var/log/admin.log

1
Não sabia que você poderia usar -vcom -f(ou que este último sequer existisse).
Sridhar Sarnobat

muito, muito útil!
samaspin

Observe que você não precisa criar um arquivo temporário para a lista de exclusão. No bash, você pode usar a substituição de processos. Isso é útil se a lista de exclusão for um tanto dinâmica e você tiver que gerá-la antes de cada uso apenas para ser usada uma vez:grep -v -f <(gen_exclusions.sh) /var/log/admin.log
Miroslav


15
tail -f admin.log|grep -v -E '(Nopaging the limit is|keyword to remove is)'

11

Você pode usar o grep regular como este:

tail -f admin.log | grep -v "Nopaging the limit is\|keyword to remove is"


1
Essa resposta funcionou para mim no MacOSX. Escapar do cano é a chave
Rebecca Dessonville

5

Os greps podem ser encadeados. Por exemplo:

tail -f admin.log | grep -v "Nopaging the limit is" | grep -v "keyword to remove is"

1
O problema aqui é que em vez do processo que estaria sendo filtrado, você teria que executar N processos sequencialmente, onde cada um deles filtra algo. Isso poderia desacelerar as coisas significativamente.
Artem Oboturov
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.