Substituir várias instâncias da mesma linha por apenas uma instância?

0

O título diz isso, realmente. Basicamente eu estou tentando condensar um arquivo de log enorme.

O Notepad ++ e o Regex (eu conheço um pequeno bit) podem excluir essas linhas repetitivas, mas o problema é que não quero que todas sejam apagadas. Quero que uma instância permaneça para preservar a estrutura / ordem das mensagens de log.

Eu pesquisei muitas respostas no Google, mas parece que só consigo resultados como isso . O problema é que eu não estou apenas tentando substituir ou excluir linhas.

Neste ponto, eu acho que o Regex tem mais chances de ter uma resposta, mas ainda estou nesse estágio em que não sei quais ferramentas estão disponíveis.

Editar:

Exemplo de mensagens que eu tenho milhares de, mas só preciso ver uma de: (Eu vejo toneladas disso, porque cada dispositivo scsi quer incluir sua própria mensagem. Eu só preciso ver que isso está acontecendo, não que isso esteja acontecendo com cada um deles).

multipathd[4893]: 3600a098000badf6800005dfe5a8cd2cd: sdie - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000badf6800005def5a8cd273: sdgq - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000badf6800005df05a8cd27b: sdeq - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000bae10c00005df55a8cd2ec: sdgw - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000bae10c00005df05a8cd2c2: sdfk - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000bae10c00005dec5a8cd2a3: sdgm - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000badf6800005df35a8cd292: sdfo - rdac checker reports path is down: ctlr is in startup sequence

Mas eu quero ver apenas

rdac checker reports path is down: ctlr is in startup sequence

    
por Lee Lemur 11.04.2018 / 06:37

1 resposta

2

Se várias instâncias forem consecutivas, você pode fazer:

Atualize de acordo com a nova solicitação:

  • Ctrl + H
  • Encontre o que: ^([^-]+- )(.+)(?:\R(?1))+
  • Substituir por: $2
  • check Embrulhe
  • verificar expressão regular
  • NÃO VERIFIQUE . matches newline
  • Substituir todos

Explicação:

^           : beginning of line
  (         : start group 1
    [^-]+-  : 1 or more NOT dash,then a dash and a space
  )         : end group 1
  (         : start group 2
    .+      : 1 or more any character
  )         : end group 2
  (?:       : start non capture group 
    \R      : any kind of linebreak
    (?1)    : same pattern than group 1 (ie. "[^-]+- ")
          : backreference to group 2
  )+        : end non capture group, must appears 1 or more times.

Substituição:

$2      : content of group 2

Resultado para o exemplo dado:

rdac checker reports path is down: ctlr is in startup sequence

Se as múltiplas instâncias não forem consecutivas, é melhor escrever um script na sua linguagem de script favorita.

Aqui está um perl one-liner que faz o trabalho:

perl -aE 'chomp;(undef,$x)=split(/-/,$_);next if exists $s{$x};$s{$x}=1;say$x' inputfile
    
por 11.04.2018 / 10:16