Como fazer a cauda para converter ^ M em CR?

1

Estou usando o putty para me conectar ao meu Ubuntu e assistir aos logs. Existe algum dispositivo que está remotamente enviando logs para lá usando o recurso remoto syslogd.

tail -f /var/log/messages

Isso mostrará os registros, no entanto, não há retornos de carro dos registros daquele dispositivo em particular, apenas ^ M. Então, a questão - existe alguma maneira de fazer cauda ou outro utilitário que é capaz de seguir fluxo, para converter ^ M para CR / LF?

Linha de amostra:

[email protected]^M CSeq: 24558 REGISTER^M Max-Forwards: 70^M Contact: acid <sip:
    
por Pablo 10.02.2012 / 15:13

2 respostas

1

^M , ou 015, é um "CR" em ASCII. O que você está perdendo é linefeeds ( ^J 012).

No entanto, é incomum a saída do syslog usar CRs como essa. O registro pela rede não usa nenhum fim de linha específico - o cliente é obrigado a enviar uma mensagem por datagrama UDP ou a especificar explicitamente o tamanho da mensagem ao usar os fluxos de transporte. As mensagens só recebem separadores de linha quando são gravadas em /var/log , por isso, se o seu /var/log/messages estivesse faltando LFs, seria o seu syslogd que estava quebrado.

Mas esse não é o caso, já que você diz em seu comentário que "mostra ^ M literalmente". tail não traduz CRs para ^M , apenas despeja dados para stdout. Em vez disso, pode ser que o seu dispositivo envie várias linhas por datagrama, e seu daemon syslog os traduza para uma sequência literal ^ + M ao gravar os arquivos de log. (Eu tenho rsyslogd aqui, ele converte um CR para #015 .)

Em outras palavras, seu dispositivo não segue o protocolo syslog.

Você pode usar o seguinte para converter essa sequência " ^M " em uma nova linha do Unix real (a LF):

sed 's/\^M/\n/g'

(Se você quiser CR + LF, use \r\n .)

    
por 10.02.2012 / 15:40
3

Se você quiser ver corretamente as quebras de linha, o caminho mais óbvio para mim é:

tail -f /var/log/messages | tr '\r' '\n'

Se você realmente quer um CRLF, você pode usar sed :

tail -f /var/log/messages | sed -e 's/\r/\r\n/g'

Editar:

Se ^ M é o caractere ^ então M try:

tail -f /var/log/messages | sed -e 's/\^M/\n/g'
    
por 10.02.2012 / 15:24