Grep log e obter texto entre delimitadores de log

Grep log e obter texto entre delimitadores de log

Existe uma maneira de grepregistrar e localizar texto entre os delimitadores de entrada de log? Nosso arquivo de log separa a entrada da linha com caracteres " -------" Então, quando eu pesquisar a palavra do texto, quero todas as linhas antes e depois dos delimitadores no log.

Registro de amostra

------------------------------------------------------------------------

    r132279 | USERID | 2014-04-30 12:59:09 -0700 (Wed, 30 Apr 2014) | 3 lines
    Removed unused "Calculated Fields" column entry.
    Jira ID: JIRA-977

------------------------------------------------------------------------

Acima, eu usaria Grep na palavra Campos, mas quero todas as linhas entre as ----linhas ""

Responder1

Se você sabe o tamanho do registro, poderá gerar linhas adicionais de contexto antes ( -B) e depois ( -A) da linha correspondente, por exemplo

grep -A2 -B2 'Fields' sample.log

ou para contexto antes e depois da linha de correspondência

grep -C3 'Fields' sample.log

Até onde eu sei, a única maneira de fazer uma correspondência multilinha verdadeira (em vez de uma correspondência de linha única mais contexto) no GNU grep é usar o modo regex PCRE ( -P) com o -zsinalizador para evitar quebras em novas linhas. Por exemplo, você poderia tentar

grep -zPo '(\n-+\n)\K(.|\n)+?Fields(.|\n)+?(?=\n-+\n)'

que faz uma correspondência não gananciosa da string Fieldscercada por quaisquer caracteres OU novas linhas, desde que seja reservada pelonova linha-hífens-nova linhadelimitadores. Uma expressão equivalente em pcregrep é

pcregrep -Mo '(\n-+\n)\K(.|\n)+?Fields(.|\n)+?(?=\n-+\n)'


Outra opção para este tipo de dados estruturados por registros é o awk: em particular, o GNU awk permite que uma expressão regular seja usada para o internoseparador de registrosRS, por exemplo

$ gawk -vRS='\n-+\n' '/Fields/ {print}' sample.log

r132279 | USERID | 2014-04-30 12:59:09 -0700 (Wed, 30 Apr 2014) | 3 lines

Removed unused "Calculated Fields" column entry.

Jira ID: JIRA-977

Responder2

Uma solução Perl semelhante àquela gawkemresposta do steeldrivercaso gawknão esteja disponível:

perl -ne 'BEGIN{$/= "-"x72 . "\n"} chomp and print if /Fields/' log_file

Substitua 72 pelo número real de traços no seu delimitador.

informação relacionada