remove 2 linhas da saída, grep corresponde à expressão regular mais próxima 1

2

Eu tenho um arquivo de log do postgresql que tem entradas de log no formato;

LOG:  execute <unnamed>: /match this here/
DETAIL:  parameters: /also want to filter this line/

Eu achei que seria possível com

grep -v --after-context=1 'match this here' /my/log/file.log

mas não funciona. existe alguma magia sed / awk / grep, ou eu tenho que fazer algum perl?

    
por Tom H 26.06.2011 / 19:06

5 respostas

2

Até onde eu sei, você não pode fazer isso apenas com o grep.
o awk pode fazer isso bem simples:

awk -v skip=-1 '/match this here/ { skip = 1 } skip-- >= 0 {next } 1' /my/log/file.log

editar:
Eu assumi que você não pode coincidir com a segunda linha por qualquer regex e você realmente quer combinar linha contendo X e a linha depois. Se você pode combinar contra uma string, é muito mais fácil:

egrep -v "match this here|also want to filter this line" /my/log/file.log

    
por 26.06.2011 / 19:51
1

Outra maneira de usar o awk:

awk '/match this here/ {getline; next} {print}' file.log
    
por 27.06.2011 / 01:37
0

Pretende usar "-v" para impedir que "combine isso aqui" exiba a primeira linha? "-v" inverte a sua expressão para dizer "as linhas de exibição que não correspondem 'correspondem a esta aqui'". Eu não estou em uma caixa * nix agora, mas eu acho que você poderia fazer algo assim se você só quisesse mostrar a segunda linha:

grep --after-context=1 'match this here' /my/log/file.log | grep -v '^LOG:' | grep -v '^-'

Isso deve imprimir ambas as linhas, mas a segunda instrução grep deve esconder a primeira linha que começa com LOG:

Tente isso e boa sorte.

    
por 26.06.2011 / 19:49
0

Não está totalmente claro o que você deseja alcançar. Se você quiser / combinar isso aqui / e, em seguida, imprima a próxima linha, então

sed -n '/match this here/{n;p}' /my/log/file.log

DETAIL:  parameters: also want to filter this line

Se você quiser / combinar isso aqui e depois imprimir a linha correspondente e a seguinte,

sed -n '/: match this here/{p;n;p}' /my/log/file.log

LOG:  execute <unnamed>: match this here
DETAIL:  parameters: also want to filter this line

Com o grep você pode

grep -A 1 'match this here' /my/log/file.log 

LOG:  execute <unnamed>: match this here
DETAIL:  parameters: also want to filter this line

se você tiver várias correspondências, cada uma será separada por --

grep -A 1 'match this here' /my/log/file.log
LOG:  execute <unnamed>: match this here
DETAIL:  parameters: also want to filter this line
--
LOG:  execute <unnamed>: match this here
DETAIL:  parameters: also want to filter this line

E você pode

grep -A 1 'match this here' /my/log/file.log | grep -v 'match this here'

para remover a primeira linha, se é isso que você quer.

    
por 27.06.2011 / 18:23
0

LOG: execute: / combine isso aqui / DETALHE: parameters: / também deseja filtrar esta linha /

STR = 'corresponde a isso aqui' FILE = / var / log / logfile.log

sed "/ $ STR / {n; d;}" $ FILE | sed / $ STR / d

    
por 14.03.2013 / 18:44

Tags