Esta pergunta deve ser movida para stackoverflow?
Muitas vezes preciso ler arquivos de log gerados por aplicativos java usando log4j. Normalmente, uma mensagem registrada (vamos chamá-lo de uma entrada de log) se estende por várias linhas. Exemplo:
INFO 10:57:01.123 [Thread-1] [Logger1] This is a multi-line
text, two lines
DEBUG 10:57:01.234 [Thread-1] [Logger2] This entry takes 3 lines
line 2
line 3
Observe que cada entrada de log inicia em uma nova linha e a primeira palavra da linha é TRACE, DEBUG, INFO ou ERROR e pelo menos um espaço.
Aqui, há 2 entradas de log, a primeira em milissegundos 123, a outra em milissegundos 234.
Eu gostaria de um comando rápido (usando uma combinação de sed / grep / awk / etc) para filtrar entradas de log (grep apenas filtra linhas), por exemplo: remova todas as entradas de log que contenham o texto 'Logger2'. br>
Eu considerei fazer as seguintes transformações:
1) junte linhas pertencentes às mesmas entradas de log com uma seqüência especial de caracteres (por exemplo: ##); Desta forma, todas as entradas de log terão exatamente uma linha
INFO 10:57:01.123 [Thread-1] [Logger1] This is a multi-line##text, two lines
DEBUG 10:57:01.234 [Thread-1] [Logger2] This entry takes 3 lines##line 2##line 3
2) grep
3) divida as linhas de volta (ou seja: substitua ## por \ n)
Eu tive problemas na etapa 1 - não tenho experiência suficiente com sed.
Talvez os 3 passos acima não sejam necessários, talvez o sed possa fazer todo o trabalho.