服务器上运行的程序发送由空字符 ( ^A
, SOH) 分隔的文本数据。当我通过 PuTTY 访问该服务器时,PuTTY 会跳过控制字符;它根本不显示它们在其“终端”屏幕上。这使得数据很难解释,因为无法区分一个字段在哪里结束,下一个字段在哪里开始。如果我打开 PuTTY 的会话日志档案在文本编辑器中,全部控制字符可见。有什么方法可以配置 PuTTY 来展示 某物当它收到控制字符时?(消息在标准FIX 协议,如果有人好奇的话。)
PuTTY 如何显示消息:
14=200015=USD17=80100009620=022=129=130=O31=158.92788132=320037=000000000038=039=140=2
vi 如何显示相同的消息:(在 vi 中,^A
以蓝色显示,使其更易于阅读。)
^A14=2000^A15=美元^A17=801000096^A20=0^A22=1^A29=1^A30=氧^A31=158.927881^A32=3200^A37=0000000000^A38=0^A39=1^A40=2
如果我将空值替换为空格,一眼就能理解:
14=2000 15=美元 17=801000096 20=0 22=1 29=1 30=O 31=158.927881 32=3200 37=0000000000 38=0 39=1 40=2
答案1
用可读的字符替换不可打印的字符。
前
$ find -print0
../03.lines./04.lines./02.lines./01.lines$
后
$ find -print0 | sed 's/\0/ /g'
../ 3.lines./ 4.lines./ 2.lines./ 1.lines$
答案2
使用标准缓冲区(从核心工具) 和tr:
$ while true; do printf "ASDF\001"; sleep 0.5; done | stdbuf -o0 tr '\001' ' '
ASDF ASDF ASDF ASDF ASDF ...
注意:用换行符替换时不需要 stdbuf,即tr '\001' '\n'
或者,使用awk/gawk
$ while true; do printf "ASDF\001"; sleep 0.5; done | awk 'BEGIN{RS="\001"}; {printf "%s ", $0}'
ASDF ASDF ASDF ASDF ASDF ...
此功能适用于任何终端。请参阅什么是缓冲...了解更多信息。