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.

Jeets
fonte

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
Eric Leschinski
fonte
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)

wisbucky
fonte
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
rezizter
fonte
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
22
egrep -v "Nopaging the limit is|keyword to remove is"
Stefan Podkowinski
fonte
15
tail -f admin.log|grep -v -E '(Nopaging the limit is|keyword to remove is)'
hs.chandra
fonte
11

Você pode usar o grep regular como este:

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

Mikhail
fonte
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"
Fidel
fonte
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