^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
.)