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