我正在使用 putty 连接到我的 ubuntu 并查看日志。有些设备正在使用 syslogd 远程工具远程向那里发送日志。
tail -f /var/log/messages
这将显示日志,但是该特定设备的日志中没有回车符,只有 ^M。那么问题是 - 是否有任何方法可以使 tail 或其他能够跟踪流的实用程序将 ^M 转换为 CR/LF?
样品管线:
[email protected]^M CSeq: 24558 REGISTER^M Max-Forwards: 70^M Contact: acid <sip:
答案1
^M
或 015,是ASCII 中的“CR”。你缺少的是换行符(^J
012)。
但是,系统日志输出很少使用这样的 CR。通过网络进行日志记录不使用任何特定的行尾 – 客户端需要为每个 UDP 数据报发送一条消息,或者在使用流传输时明确指定消息长度。消息只有在写出时才会添加行分隔符/var/log
,因此如果您/var/log/messages
缺少 LF,则可能是您的 syslogd 出现故障。
但事实并非如此,因为你在评论中说“它按字面意思显示 ^M”。tail
不会将 CR 转换为^M
,它只会将数据转储到 stdout。相反,可能是你的设备做每个数据报发送多行,并且您的 syslog 守护进程在写入日志文件时将它们转换为文字^
+M
序列。(我这里有 rsyslogd,它将 CR 转换为#015
.)
换句话说,您的设备不遵循 syslog 协议。
您可以使用以下命令将此类“ ^M
”序列转换为真实的Unix 换行符(LF):
sed 's/\^M/\n/g'
(如果您想要 CR+LF,请使用\r\n
.)
答案2
如果您希望它正确地看到换行符,对我来说最明显的方法是:
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'