サーバー上で実行されているプログラムは、ヌル文字(^A
、SOH)。 PuTTYを介してそのサーバーにアクセスすると、PuTTYは制御文字をスキップします。 「ターミナル」画面にはまったく表示されません。これにより、あるフィールドが終了する場所と次のフィールドが開始する場所を区別できないため、データの解釈が非常に困難になります。テキストエディタでPuTTYのセッションlogfileを開くと、allコントロール文字が表示されます。制御文字を受け取ったときにPuTTYをdisplaysomethingに構成する方法はありますか? (メッセージは標準 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
Nullをスペースに置き換えると、一目でわかります。
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
印刷できない文字を読みやすいものに置き換えてください。
$ 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(fromcoreutils)およびtr:
$ while true; do printf "ASDF\001"; sleep 0.5; done | stdbuf -o0 tr '\001' ' '
ASDF ASDF ASDF ASDF ASDF ...
注:改行、つまりtr '\001' '\n'
に置き換える場合、stdbufは必要ありません。
または、awk/gawkを使用します
$ while true; do printf "ASDF\001"; sleep 0.5; done | awk 'BEGIN{RS="\001"}; {printf "%s ", $0}'
ASDF ASDF ASDF ASDF ASDF ...
これは、端末に関係なく機能します。詳細については、 バッファリングとは... を参照してください。