如何使尾部将 ^M 转换为 CR?

如何使尾部将 ^M 转换为 CR?

我正在使用 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”。你缺少的是换行符^J012)。

但是,系统日志输出很少使用这样的 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'

相关内容