1

Я использую замазку для подключения к моей Ubuntu и просмотра журналов. Есть какое-то устройство, которое удаленно отправляет туда логи, используя удаленное средство syslogd.

tail -f /var/log/messages

Это покажет журналы, однако нет каретки возврата из журналов этого конкретного устройства, только ^ M. Таким образом, вопрос - есть ли способ сделать tail или другую утилиту, которая может следовать за потоком, конвертировать ^ M в CR/LF?

Образец линии:

ccc-2e893c98@192.168.1.13^M CSeq: 24558 REGISTER^M Max-Forwards: 70^M Contact: acid <sip:

2 ответа2

3

Если вы хотите, чтобы он правильно видел разрывы строк, самый очевидный способ для меня:

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

Если вы действительно хотите CRLF, вы можете использовать sed:

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

Редактировать:

Если ^ M является символом ^, то M попытайтесь:

tail -f /var/log/messages | sed -e 's/\^M/\n/g'
1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .