^M или 015, является "CR" в ASCII. Чего вам не хватает, так это перевода строки (^J 012).
Однако для вывода системного журнала необычно использовать такие CR. Ведение журнала по сети не использует каких-либо конкретных окончаний строки - клиенту необходимо отправить одно сообщение на каждую дейтаграмму UDP или явно указать длину сообщения при использовании потоковых транспортов. К сообщениям добавляются разделители строк только тогда, когда они записаны в /var/log , поэтому, если в ваших /var/log/messages отсутствуют LF, это будет ваш системный журнал, который будет поврежден.
Но это не тот случай, так как в своем комментарии вы говорите, что «буквально показывает ^ M». tail не переводит CR в ^M , он просто сбрасывает данные в стандартный вывод. Вместо этого, может быть , что устройство действительно отправить несколько строк на дейтаграммы, и ваш системный журнал демон переводит их в буквальном ^ + последовательности M при записи лог - файлов. (У меня есть rsyslogd здесь, он конвертирует CR в #015 )
Другими словами, ваше устройство не поддерживает протокол системного журнала.
Вы можете использовать следующее для преобразования такой последовательности « ^M » в реальный перевод строки Unix (LF):
sed 's/\^M/\n/g'
(Если вы хотите CR+LF, используйте \r\n .)