Existe alguma maneira de converter um log “All session output”, com caracteres de controle, em um log de “saída imprimível” mais legível?

3

Tivemos um contratante interno para ajudar com alguma configuração de um produto e estamos tentando examinar os registros de massa que ele montou para nós, mas em vez de usar "saída imprimível" ele usou "toda a saída da sessão" que inclui todas as teclas, incluindo "BS", etc, tornando os logs muito difíceis de ler, pois ele tinha muitos, muitos erros de digitação. ou seja:

[ESC]] 0; raiz @ host: ~ [BEL] [raiz @ host ~] # itm, cm [BS] [BS] [ESC] [K [BS] [ESC] [agente Kcmd starp [BS ] t

Existe alguma maneira de eliminar esses caracteres de controle, de forma inteligente, para que o resultado final seja um arquivo legível para humanos, muito parecido com o que você veria no formato "saída imprimível"?

Obrigado pela sugestão abaixo. Nosso maior ponto de vista são os caracteres de controle [BS], o que tornaria isso:

ls-pg [BS] [BS] al P [BS] | greu [BS] p dr

para:

ls -al | grep dr

Alguma ideia de como isso pode ser feito?

    
por user162124 27.02.2013 / 17:47

2 respostas

4

Ative uma rolagem muito grande em massa, cat do arquivo de log e copie e cole o resultado em um novo arquivo.

    
por 27.02.2013 / 19:32
1

Embora não seja perfeito, este filtro sed lhe dará um ponto de partida.

sed -r 's/(\[[A-Z]+\]?|\]0;)//g' escapes.log > noescapes.log

Se eu canalizar sua amostra através desse filtro, recebo:

root@host:~[root@host ~]# itm,cmcmd agent starpt

Uma solução que depende de um comando / script para analisar os códigos de terminal reais seria mais elegante, isso é mais uma "correção rápida".

Repartição de regex para quem está tentando aprendê-lo:

  • parênteses externos para propósitos de alternância (o caractere | é OR)
  • \[ e \] são colchetes com escape, para que não sejam interpretados como uma classe de caracteres.
  • [ ] contém uma classe de caracteres. [A-Z] é uma classe para correspondência de qualquer letra maiúscula.
  • + indica que corresponde a "um ou mais do átomo anterior". O átomo anterior era a classe de caracteres, então "uma ou mais letras maiúsculas".
  • ? indica que o átomo anterior é opcional. Nesse caso, o átomo opcional é \] .
  • Significado combinado neste ponto: "uma ocorrência de um ou mais caracteres maiúsculos precedidos por um literal [ opcionalmente com sufixo por um literal]"
  • O caractere | é o início da OR.
  • \]0; corresponde a 'um literal' com o sufixo 0; '.

A string de substituição está vazia, então eles são removidos. /g informa sed para não parar no primeiro jogo.

    
por 27.02.2013 / 18:38