Como faço para remover blocos de texto dentro de um arquivo de log? [fechadas]

1

Eu tenho o seguinte log:

2016/01/20 00:00:16.035 [T114BaseServlet] ... Blah Blah Blah
2016/01/20 00:00:16.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
2016/01/20 00:00:29.531 [T114BaseRequestPayloadParser] ... Blah Blah Blah
2016/01/20 00:00:36.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah

Desejo remover essas ApplicationState linhas, mas não há padrão no final dessas Blah Blah Blah .

Este é o bloco que eu quero remover:

2016/01/20 00:00:16.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah

antes do próximo pedido começar.

    
por Omar Morales 24.01.2016 / 20:33

2 respostas

2

Para remover todo o bloco de linhas que começam com uma, incluindo sua correspondência até a linha que ocorre imediatamente antes da próxima ocorrência de [T1114Base , você pode fazer o seguinte:

sed -e'$!N;/ApplicationState.*\n/,/\n.*\[T1114Base/!P;D' <in >out

É bastante simples entender como isso funciona. Por padrão, sed consome uma linha por vez. Mas se você quiser uma perspectiva mais ampla, você só precisa fazer o script.

Portanto, para cada linha de entrada, se a corrente for ! , não a $ última, sed acrescentará a linha N ext ao espaço padrão conforme delimitado por um caractere \n ewline interveniente.

Na expressão de intervalo, primeiro procuro por qualquer correspondência para ApplicationState seguido por qualquer * number de qualquer . caracteres, seguido por pelo menos um \n ewline. Para finalizar a expressão range eu preciso dar uma olhada - que é o propósito do $!N em primeiro lugar. sed verifica a próxima ocorrência da linha que ocorreria após a última que você deseja remover. Ele procura por um \n ewline seguido por um padrão que deve corresponder ao início do próximo bloco de entrada.

Se essa expressão de intervalo for ! não correspondida, sed irá P rint até o primeiro \n ewline em exibição no espaço padrão e, independentemente de uma correspondência sed , depois D eleteará para a primeira linha nova ocorrendo no espaço padrão e reciclar para o topo do script com o que resta.

Basicamente, sed desliza sobre linhas de entrada 2 de cada vez, possivelmente P rinteando o mais antigo se ele não ocorrer dentro do bloco de exclusão e sempre D apenas o mais antigo antes de anexar o N ext.

    
por 24.01.2016 / 20:50
1

Você realmente tentou?

Supondo que você queira remover toda a linha:

sed '/ApplicationState/d' inputfile
    
por 24.01.2016 / 20:35