Отображать нулевые символы в PuTTY
Программа, запущенная на сервере, отправляет текстовые данные, разделенные нулевым символом (^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 = USD^ A17 = 801000096^ A20 = 0^ A22 = 1^ A29 = 1^ A30 = O^ A31 = 158.927881^ A32 = 3200^ A37 = 0000000000^ A38 = 0^ A39 = 1^ A40 = 2
Если я заменю нули пробелами, это понятно с первого взгляда:
14 = 2000 15 = USD 17 = 801000096 20 = 0 22 = 1 29 = 1 30 = O 31 = 158,927881 32 = 3200 37 = 0000000000 38 = 0 39 = 1 40 = 2
2 ответа
Замените непечатные символы чем-то читаемым.
до
$ find -print0
../03.lines./04.lines./02.lines./01.lines$
после
$ find -print0 | sed 's/\0/ /g'
../ 3.lines./ 4.lines./ 2.lines./ 1.lines$
Используйте stdbuf (из coreutils) и 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 ...
Это работает независимо от терминала. Посмотрите, что буферизует... для получения дополнительной информации.