Como posso usar o grep para exibir linhas SEM uma das duas strings específicas?

6

Para um grande arquivo de log, como eu exibo essas linhas sem "sucesso" ou não terminadas com "ok"?

    
por Lee 02.03.2016 / 19:42

4 respostas

14

Para remover linhas que contenham , especificamente com grep:

  • Em um comando, por comentário do jordanm:

    grep -Ev 'success|ok$'
    

    ou:

    grep -ve success -e 'ok$'
    

    ou:

    grep -v 'success
    ok$'
    
  • Em dois comandos:

    grep -v success file | grep -v 'ok$'

Exemplo:

$ cat file
success something else
success ok
just something else

$ grep -Ev 'success|ok$'
just something else
$ grep -v success file | grep -v 'ok$'
just something else

Para remover linhas que contenham ambas strings, especificamente com grep:

grep -v 'success.*ok$' file

Exemplo:

$ cat file
success something else
success ok
just something else

$ grep -v 'success.*ok$' file
success something else
just something else
    
por 02.03.2016 / 20:15
2

Eu tentaria o awk

awk '/success/ { next ; } /ok$/ { next ; } { print ;}' file

onde

  • /success/ { next ; } encontra a palavra success e pula a linha
  • /ok$/ { next ; } encontra minúsculas ok e pula linha
  • { print ;} implícito else: linha de impressão

como por sugestão

short awk (graças a Stéphane Chazelas)

awk '!/success/ && !/ok$/'

que basicamente não é (sucesso) e não (ok no final da linha)

golfed awk (obrigado a cas)

awk '! /success|ok$/'

que reutilizam o regexp e o negam

    
por 02.03.2016 / 19:47
0

Adicionando aos comandos grep -Ev acima: Você pode usar egrep -v 'success|ok$' filename

    
por 03.03.2016 / 10:30
0

Como o awk foi mencionado, outra alternativa seria sed:

sed '/success/d;/ok$/d' file
sed -e '/success/d' -e '/ok$/d' file

ou (Newer sed e future POSIX) graças a Stéphane Chazelas

sed -E '/success|ok$/d' file
    
por 03.03.2016 / 09:49