Exclui um bloco de linhas com uma condição na última linha

4

Eu tenho um arquivo de log onde no final de uma série de linhas você pode ver se este bloco é relevante. Agora estou procurando um comando como sed para excluir os blocos que terminam com "Content-Length: 0" e começando com o último "-" antes desta linha.

Eu tentei sed -n "/--/,/Content-Length: 0/d" , mas isso leva o primeiro "-" e o primeiro "Content-Length: 0" e o exclui.

ex:

line 1 "--"  
line 2   
line 3 "Content-Length: 20"  
line 4 "--"  
line 5  
line 6 "Content-Length: 0" 

eu quero excluir a linha 4,5 e 6 e não a linha 1 a 6

como posso fazer isso?

A resposta para trabalhar com tac em vez de cat faz o trabalho! mas ultimamente eu gostaria de usar isso em um tail -f construção

    
por Gilles 07.11.2012 / 00:47

4 respostas

5

Aqui está uma maneira de usar GNU sed :

sed -n '/--/,/Content-Length: 0/ { H; /Content-Length: 0/ { g; s/\n\(.*\)\n.*--.*//p } }'

Resultado:

line 1 "--"  
line 2   
line 3 "Content-Length: 20"  

Explicação:

Match between the pattern range. Append this range to the hold space. On the last
line of the range, copy the hold space to pattern space to work with it. Then use
find/replace regex to remove everything after the last occurrence of '--'. HTH.
    
por 07.11.2012 / 13:52
2

Tente

sed -n "N;s/--.*Content-Length: 0//;P"
    
por 07.11.2012 / 09:15
1

Se o comando tac estiver presente, use o tac para que possamos verificar o padrão reverso:

tac file | sed "/Content-Length: 0/,/--/d" | tac
    
por 07.11.2012 / 05:47
1

Você pode fazer isso:

sed 'H;/^--$/h;/Content-Length.*[1-9]/!d;g'

Isso anexa todas as linhas para manter o espaço. As linhas do marcador -- sobrescrevem o espaço de armazenamento - assim você começa com um novo buffer para cada um dos blocos -- through Content . Todas as linhas que não contiverem a sequência Content-Length seguida em pelo menos um dígito que não seja 0 serão excluídas. Então, a única chance que você poderia finalmente g et manter o espaço de volta no espaço padrão e imprimi-lo é em uma linha que corresponde a Content-Length então algum dígito que não é 0 ponto em que cada linha desde o último -- é impresso.

    
por 20.08.2014 / 06:33