Remove os caracteres de controle do /var/log/boot.log

1

Eu tenho um script que envia e-mail para o grupo sysadmin quando um servidor é ligado ou desligado. O email contém o despejo de alguns registros importantes, como /var/log/messages , /var/log/secure , /var/log/boot.log . O /var/log/boot.log contém alguns caracteres especiais que, quando enviados por e-mail, parecem truncados, pois contêm alguns caracteres especiais de formatação para colorir e guias. Como faço para remover esses caracteres especiais para torná-lo legível?

Eu sei que posso usar sed para remover os personagens, mas estou procurando uma solução fácil e elegante.

(O /var/log/boot.log é do CentOS 6.x)

Aqui está um dump do meu /var/log/boot/.log :

[root@vagrant ~]# cat -v /var/log/boot.log 
^[%G            Welcome to ^[[0;36mCentOS^[[0;39m ^M
Starting udev: ^[%G^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Setting hostname vagrant:  ^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Setting up Logical Volume Management:   5 logical volume(s) in volume group "vgdynamic" now active^M
  3 logical volume(s) in volume group "vgstatic" now active^M
^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Checking filesystems^M
/dev/mapper/vgstatic-lvroot: clean, 8102/884736 files, 175959/3537920 blocks^M
/dev/sda1: clean, 44/32768 files, 17226/131072 blocks^M
/dev/mapper/vgdynamic-lvhome: clean, 10280/196608 files, 74141/786432 blocks^M
/dev/mapper/vgdynamic-lvopt: clean, 932/655360 files, 104046/2620416 blocks^M
/dev/mapper/vgstatic-lvtmp: clean, 12/131072 files, 25386/524288 blocks^M
/dev/mapper/vgstatic-lvusr: clean, 41785/262144 files, 236524/1048576 blocks^M
/dev/mapper/vgdynamic-lvvar: clean, 1989/393216 files, 93057/1572864 blocks^M
/dev/mapper/vgdynamic-lvvarlog: clean, 55/49152 files, 8030/196608 blocks^M
/dev/mapper/vgdynamic-lvaudit: clean, 14/65536 files, 73366/262144 blocks^M
^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Remounting root filesystem in read-write mode:  ^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Mounting local filesystems:  ^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Enabling /etc/fstab swaps:  ^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Entering non-interactive startup^M
Calling the system activity data collector (sadc)... ^M
Starting monitoring for VG vgdynamic:   5 logical volume(s) in volume group "vgdynamic" monitored^M
^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Starting monitoring for VG vgstatic:   3 logical volume(s) in volume group "vgstatic" monitored^M
^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Bringing up loopback interface:  ^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Bringing up interface eth0:  ^M
Determining IP information for eth0... done.^M
^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Starting auditd: ^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Starting system logger: ^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Starting lwsmd: ^[[60G[^[[0;32m  OK  ^[[0;39m]^M^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Mounting filesystems:  ^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Retrigger failed udev events^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Starting the VirtualBox Guest Additions ^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Starting VirtualBox Guest Addition service ^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Starting sshd: ^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Starting ntpd: ^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Starting crond: ^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
Starting atd: ^[[60G[^[[0;32m  OK  ^[[0;39m]^M^M
[root@vagrant ~]# 
    
por GMaster 26.10.2014 / 05:44

2 respostas

1

Você deve começar com os padrões mais complexos (mais longos) primeiro, se começar apenas com os caracteres de controle, o restante poderá corresponder aos padrões no texto normal também. Se a velocidade não for a prioridade mais alta, divida o processamento por várias instruções, assim será mais fácil depurar e você poderá controlar mais facilmente a ordem de remoção.

As seqüências de escape de cores começam com ^[ e terminam em m . Você pode removê-los usando sed : ¹

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m//g"

Outros padrões começam com ^[ e terminam em G (cursor de posição):

sed -r "s/\x1B\[.*G//g"

Quaisquer caracteres de controle restantes devem acompanhar:

sed 's/[[:cntrl:]]//g' 

Combinado em:

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?m//g" /var/log/boot.log | \
   sed -r "s/\x1B\[.*G//g" | \
   sed 's/[[:cntrl:]]//g'

¹ Se isso é elegante ou se o elefante está nos olhos de quem vê.

    
por 26.10.2014 / 06:29
0

Talvez o comando dos2unix seja o que você está procurando.

    
por 27.10.2014 / 09:39