Ative uma rolagem muito grande em massa, cat
do arquivo de log e copie e cole o resultado em um novo arquivo.
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?
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:
|
é 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 é \]
. |
é 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.