お金をかけずにサーバーの勉強をしよう

odコマンド(サーバーでの確認に便利)

2023年5月2日

メニューへ戻る

Linuxのサーバーで障害対応する時に使える odコマンドについて。

Windowsサーバーと UNIX/Linuxサーバー混在の環境で、サーバー間でファイルベースのデータ連携があったとします。

ご存知の通り、Windowsのテキストファイルの改行コードは [CR+LF]で、UNIX/Linuxは [LF]だけです。

普通この差異はファイルの転送時にどちらかのサーバーで変換するものですが、障害時にはサーバー間の転送ではなく臨時にメール添付して送ってきてくれたりします。

他にも BOM(Byte Order Mard)つき UTF-8コードのファイルをくれたりと、例を上げるに事欠きません。


結果として受け取り側のシステムでファイル内のデータを取り込む時に問題が出ます。

その時アプリケーションのエラーメッセージから「受信したデータ(ファイル)が怪しい…」とあたりをつけるのですが、この時にバイナリエディタに準ずるバイト単位にファイルの中身を確認できると原因特定が捗ります。

そういうのは VSCodeで見ればパツイチよ!

というのはプログラマの考えで、サーバーにはそんなモノ入っちゃいません。


そんなときによく od(dump files in octal and other formats)コマンドを使っていました。

Lubuntu 22.04(サーバーOSじゃないが)には入ってましたが、まずどの Linuxディストリビューションでも UNIXでもあると思います。


さて、ここに 2つのファイルを用意いたしました。

[Windows.txt]は、Windows10のメモ帳で、「aaaa(エンター)」としたもの、
[Linux.txt]は、LubuntuのFeatherPad(テキストエディタ)で、「bbbb(エンター)」としたものです。

まずは両方とも Lubuntuの cat(concatenate files and print on the standard output)コマンドで表示してみます。

subro@Lubuntu2204:~$ cat Windows.txt
aaaa
subro@Lubuntu2204:~$ cat Linux.txt
bbbb
subro@Lubuntu2204:~$

両方ともフォーマットに問題があるようには見えません。

今度は odコマンドで見てみましょう。

subro@Lubuntu2204:~$ od Windows.txt
0000000 060541 060541 005015
0000006
subro@Lubuntu2204:~$ od Linux.txt
0000000 061142 061142 000012
0000005

何か訳の分からない数字が出てきました。
行頭の 6桁の数字はファイルの何バイト目からか(0スタート)を表しています。 では、後ろの数字は何なのか。

odコマンドはデフォルトでは 8進数で文字コードを表示してくれるのです。

「a」の文字コードは 16進数では 61
「b」の文字コードは 16進数では 62

です。
それぞれのファイルで、「a」が 4文字、「b」が 4文字でしたので、16進数では、

61 61 61 61
62 62 62 62

って感じで文字コードが並んでるんですね。

例えば、[Windows.txt]の最初の 2文字の 16進数のコード「6161」を Windowsの電卓あたりで 8進数に直してみて下さい。

60541

となったと思います。
「おやっ?」ってなりますよね。

でもコンピューターをやっていても 8進数はちょっと使い辛いです。
なんせ文字コードは普通 16進数で扱うことが多いから。

そんな時には od コマンドに [-x]オプション(same as -t x2, select hexadecimal 2-byte units)を付けてみましょう。

subro@Lubuntu2204:~$ od -x Windows.txt
0000000 6161 6161 0a0d
0000006
subro@Lubuntu2204:~$ od -x Linux.txt
0000000 6262 6262 000a
0000005

16進数表示になって、さっきよりは取っ着き易くなったんではないでしょうか。
しかしそれでもまだ「16進コードを全部覚えてろってか?!」という気がします。

次に od コマンドに [-c]オプション(same as -t c, select printable characters or backslash escapes)を付けてみましょう。

subro@Lubuntu2204:~$ od -c Windows.txt
0000000   a   a   a   a  \r  \n
0000006
subro@Lubuntu2204:~$ od -c Linux.txt
0000000   b   b   b   b  \n
0000005

ここまでくるともうおわかりかと思います。
そして「aaaa」「bbbb」の後ろにあるもの、これが改行コードです。
(「¥」は実際はバックスラッシュで表示されます)

[\r] = CR(Carriage Return)
[\n] = LF(Line Feed)

どうでしょうか。
Windowsと Linuxで作ったテキストファイルで改行の文字コードが違うことが見て取れますよね。

障害対応のときはここで「あぁ、やっぱり…」って原因特定して、次は改行コードが変換されなかった原因の調査に入ります。


上にも書いた通り改行コードの誤りは例で、私が実際に経験したことがあるのは

なんてのがありました。

分かってみればシンプルな原因なんですけど、サーバー上でサクッと確認をするのに odコマンドが役に立つ時があるのでこれを書きました。

お役に立てれば幸いです。