Como faço para grep um log de postgresql de várias linhas?

1

Se eu precisar procurar algum comando nos logs do sistema, isso acontece:

$cat /var/log/postgresql/postgresql-9.1-main.log | grep 'UPDATE limit'
8833 2017-02-01 12:31:51 BRST [email protected] anotherdb LOG:  comando: UPDATE limit
5067 2017-02-02 17:38:27 BRST [email protected] thisdb LOG:  comando: UPDATE limit

Mas eu preciso do comando completo, estou tentando vários comandos como pcggrep, agrep, grep, mas não estou tendo nenhum sucesso.

O resultado esperado precisa ser assim (observe que o número de linhas na consulta pode variar):

8833 2017-02-01 12:31:51 BRST [email protected] anotherdb LOG:  comando: UPDATE limit
                        SET xxx = xxx
                        FROM xxx
                          JOIN xxx ON xxx = xxx AND xxx = xxx
                          JOIN xxx ON xxx = xxx AND xxx = '012017'
                        WHERE xxx = xxx and xxx = 13
5067 2017-02-02 17:38:27 BRST [email protected] thisdb LOG:  comando: UPDATE limit
                        SET xxx = xxx
                        FROM xxx
                          JOIN xxxx ON xxx = xxx AND xxx = xxx

Eu tentei pcggrep e agrep, mas eles estão esperando algo como um padrão inicial ou padrão final, mas eu acho que não tenho um padrão final, essa é a configuração postgresql padrão em português, mas olhando a olho, você pode ver quando uma nova linha da consulta começar por este número 8833 ou 5067.

    
por Luciano Andress Martini 03.02.2017 / 12:09

1 resposta

1

Para usar pcregrep , tente isto:

pcregrep -iM "^[0-9]+.*UPDATE limit.*\n(^[^0-9].*\n){1,}" /var/log/postgresql/postgresql-9.1-main.log

-i é para insensibilidade a maiúsculas e minúsculas; -M é para multilinha;

Você pode alterar a string "UPDATE limit" para outro tipo de consulta que você precisa pesquisar.

Basicamente, o regexp é: encontre todas as linhas que começam com um ou mais dígitos, seguidas por uma string, depois a consulta, seguida por uma string até o final da linha, seguida por 1 ou mais linhas () { 1,} que não começam com dígitos [^ 0-9].

Aqui está um link sobre expressões regulares estendidas.

    
por 03.02.2017 / 13:39