Отображать нулевые символы в 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 ...

Это работает независимо от терминала. Посмотрите, что буферизует... для получения дополнительной информации.

Другие вопросы по тегам