Existe uma maneira de grep
registrar 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 -z
sinalizador 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 Fields
cercada 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 gawk
emresposta do steeldrivercaso gawk
nã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.