3

Программа, запущенная на сервере, отправляет текстовые данные, разделенные нулевым символом (^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 отображается синим цветом, что облегчает чтение.)

^ A 14 = 2000 ^ A 15 = USD ^ A 17 = 801000096 ^ A 20 = 0 ^ A 22 = 1 ^ A 29 = 1 ^ A 30 = O ^ A 31 = 158.927881 ^ A 32 = 3200 ^ A 37 = 0000000000 ^ A 38 = 0 ^ A 39 = 1 ^ A 40 = 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 ответа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$
0

Используйте 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 ...

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .