grep forma a parte inferior e exibe as linhas após a partida

0

Como conseguir esta tarefa, eu retirei a carne suína atualizando novas assinaturas diárias para a sid_changes.log e aqui está uma palavra-chave de pesquisa "Novas Regras", eu queria pesquisar for sid_changes.log e dividir essas linhas após a correspondência "Novo Regras "para o novo arquivo, eu vim em grep -A ,-B , mas esses sinalizadores esperam números de linha e não consigo determinar o número da linha, pois ele será dinâmico ... então, esses sinalizadores não são úteis para mim.

Eu tenho tentado até agora com diff command diff --changed-group-format="%>" --unchanged-group-format="" data1 data2 e existe uma técnica melhor porque eu tenho que definir cron jobs para primeiro copiar o sid_changes.log antes que ele seja atualizado e então diferenciá-lo com o novo sid_changes.log , então isso parece uma solução bagunçada ... Estou esperando uma solução ou um design melhor para isso.

sid_changes.log
-=Begin Changes Logged for Wed Jan  2 19:05:09 2018 GMT=-

New Rules
        Reported CnC Server Port 40669 Group 1 (1:2405179)
        Server Port 45351 Group 1 (1:2405180)

-=Begin Changes Logged for Wed Jan  3 19:05:09 2018 GMT=-

New Rules
        ET CNC Shadowserver Reported CnC Server Port 40669 Group 1 (1:2405179)
        ET CNC Shadowserver Reported CnC Server Port 45351 Group 1 (1:2405180)
        ET CNC Shadowserver Reported CnC Server Port 47221 Group 1 (1:2405181)

-=Begin Changes Logged for Thu Jan  4 19:05:01 2018 GMT=-

New Rules
        BROWSER-OTHER Apple Safari javascript mutlibyte character escaping denial of service attempt (1:45354)
        BROWSER-OTHER Apple Safari javascript mutlibyte character escaping denial of service attempt (1:45355)
        BROWSER-OTHER Multiple browser long unicode string denial of service attempt (1:45302)
        BROWSER-OTHER Multiple browser long unicode string denial of service attempt (1:45303)
        BROWSER-PLUGINS UCanCode ActiveX clsid access attempt (1:45270)



ouputfile.log
-=Begin Changes Logged for Thu Jan  4 19:05:01 2018 GMT=-

New Rules
        BROWSER-OTHER Apple Safari javascript mutlibyte character escaping denial of service attempt (1:45354)
        BROWSER-OTHER Apple Safari javascript mutlibyte character escaping denial of service attempt (1:45355)
        BROWSER-OTHER Multiple browser long unicode string denial of service attempt (1:45302)
        BROWSER-OTHER Multiple browser long unicode string denial of service attempt (1:45303)
        BROWSER-PLUGINS UCanCode ActiveX clsid access attempt (1:45270)

    
por shekhar 05.01.2018 / 11:37

2 respostas

1

Eu usaria um comando perl assim:

perl -ne 'if($_=~/^-=Begin/){@last=@block; @block=(); push(@block,$_);}else{push(@block,$_)}; END{@last=@block; print @last}'

Explicação:

  • perl -ne ' - > ler linha de entrada sábia
  • if($_=~/^-=Begin/){@last=@block; @block=();push(@block,$_);} - > liberar o último bloco para a matriz por último e iniciar o novo bloco se a linha começar com - = Iniciar
  • else{push(@block,$_)}; - > adicionar linha atual para bloquear
  • END{@last=@block; print @last}' - > liberar o último bloco e imprimi-lo


Para ler sid_changes.log e escrever em outfile.log , você pode executá-lo assim:

perl -ne '...' < sid_changes.log > outfile.log
    
por Wayne_Yux 05.01.2018 / 14:12
0

Você pode usar grep para encontrar o número da linha do último separador de entrada de log e, em seguida, usar tail para imprimir apenas linhas a partir dele:

lineno="$(grep -ne '^-=' sid_changes.log | tail -n 1 | cut -d ':' -f 1)"
tail -n "+$lineno" sid_changes.log > outfile.log

ou como um one-liner

tail -n "+$(grep -ne '^-=' sid_changes.log | tail -n 1 | cut -d ':' -f 1)" sid_changes.log > outfile.log

Se a entrada não é um arquivo, mas um pipe / FIFO e você só pode percorrê-lo uma vez que você pode usar um pequeno programa que rastreia as entradas de log, mas apenas retorna o último:

#!/usr/bin/env python3
import sys

separator_prefix = '-='
last_entry = []

for line in sys.stdin:
    if line.startswith(separator_prefix):
        last_entry.clear()
    last_entry.append(line)

print(*last_entry, sep='', end='')

Uso:

python3 last-chang-entry.py < sid_changes.log > outfile.log
    
por David Foerster 05.01.2018 / 15:18