UNIX/Linuxの部屋 コマンド:od

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




コマンド od ファイルのダンプ (8進数/10進数/16進数表示) このエントリーをはてなブックマークに追加

最終更新


UNIX/Linux における od コマンドはファイルや標準入力のデータを 8進数・10進数・16進数で表示するコマンドである。



od コマンドの基本的な使い方
od は "Octal Dump" の略なので、デフォルトは 8進数ダンプとなる。ただし 2バイト単位での 8進数表記であるため、かなりわかりづらい。
% od file.txt
0000000 020474 026455 044444 035144 064440 062156 074145 064056
0000020 066564 026154 020166 027061 032063 031040 030060 027471
0000040 032060 030457 020070

od に -x オプションを付けると 16進数になるのだが、これも 2バイト単位であり、わかりづらい。
% ls -l | od -x
0000000 614d 656b 6966 656c 610a 610a 632e 610a
0000020 6f2e 7475 610a 7364 6e65 6573 642e 7461

なおかつ i386, x86_64 ではバイトオーダーがリトルエンディアンであるため、上記の "614d" や "656b" は、実際は "4d61" "6b56" である。

これではさすがにわかりづらいので、-tx1c オプションの使用をお勧めする。これならば 16進数で、(バイトオーダーに関わらず) 標準入力の並びのとおりに、ASCII 文字列付きで表示してくれる。
% echo abcdefghijklmnopqrstu | od -tx1c
0000000    61  62  63  64  65  66  67  68  69  6a  6b  6c  6d  6e  6f  70
           a   b   c   d   e   f   g   h   i   j   k   l   m   n   o   p
0000020    71  72  73  74  75  0a
           q   r   s   t   u  \n
0000026

-t オプション
od コマンドの -t オプションは無駄に汎用的で、わかりづらいオプションである。-t の後には以下のようなフォーマットを表す文字を指定する。
x[長さ] 16進数表記
d[長さ] 10進数表記
o[長さ] 8進数表記
c 文字表記 (改行コードなどは \r や \n のように表記)
a 文字表記 (改行コードなどは CR や LF のように表記)
x・d・o の場合、最後に長さを指定することで、何バイト単位でダンプするかを指定できる。省略時は 2となるが、2バイト単位でダンプしたい場合などまずない。忘れずに "1" を付加しよう。つまり以下のようになる。
  • -tx1 … 1バイト単位で 16進数表記
  • -tx2 … 2バイト単位で 16進数表記
  • -tx4 … 4バイト単位で 16進数表記
  • -td1 … 1バイト単位で 10進数表記
  • -td2 … 2バイト単位で 10進数表記
  • -td4 … 4バイト単位で 10進数表記
  • -tx … (省略したので) 2バイト単位で 16進数表記
  • -td … (省略したので) 2バイト単位で 10進数表記

さらに -t オプションは複数指定することができるので、ある入力に対して「文字表記したもの」と「16進数表記したもの」の 2パターンを表示する、ということも可能である。例えば、上記の例の
% echo abcdefghijklmnopqrstu | od -tx1c
0000000    61  62  63  64  65  66  67  68  69  6a  6b  6c  6d  6e  6f  70
           a   b   c   d   e   f   g   h   i   j   k   l   m   n   o   p
は、「-tx1」(1バイト単位で16進数) と「-tc」(文字表記) を組み合わせたものである。

以下に理解を深めるためのさらなる例を示す。
% echo abcdefghijklmnopqrstu | od -tcx1
0000000    a   b   c   d   e   f   g   h   i   j   k   l   m   n   o   p
           61  62  63  64  65  66  67  68  69  6a  6b  6c  6d  6e  6f  70
⇒ x1 と c の順序を逆にしたので、"a" と "61" の行が逆になった
% echo abcdefghijklmnopqrstu | od -tx1ccc 0000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 a b c d e f g h i j k l m n o p a b c d e f g h i j k l m n o p a b c d e f g h i j k l m n o p
⇒ 同じフォーマット (c) を複数回指定したので、同じ出力が何度も行われる
% echo abcdefghijklmnopqrstu | od -tx1d1o1c 0000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 141 142 143 144 145 146 147 150 151 152 153 154 155 156 157 160 a b c d e f g h i j k l m n o p
⇒ 16進数・10進数・8進数・文字表記の順

od コマンドのその他オプション
▷ -j[スキップバイト数] … 先頭 Nバイトをスキップする
% cat file.txt | od -j100
⇒ 先頭 100バイトをスキップし、101バイト目からダンプする。
▷ -N[表示バイト数] … N バイトダンプしたらそこで処理を打ち切る
% cat file.txt | od -N100
⇒ 先頭から 100バイトのみを対象にダンプする。
-j と -N を組み合わせることで、一定範囲のみをダンプ対象とすることができる。
% cat file.txt | od -j50 -N100
⇒ 先頭 50バイトをスキップし、その後 100バイトのみを対象にダンプする。
▷ -A[基数] … 左側に表示されるアドレス (ファイルオフセット) の表記方法を指定する。
デフォルトは 8進数であるため、下記のような表示になる (1行目は 1バイト目〜16バイト目、2行目は 17バイト目〜32バイト目)。
0000000 ...
0000020 ...
0000040 ...
基数を x にすると 16進数での表示になる。
% od -Ax
0000000 ...
0000010 ...
基数を d にすると 10進数での表示になる。
% od -Ax
0000000 ...
0000016 ...
また、od -An とすると、左側のアドレス (ファイルオフセット) が表示されなくなる。

関連コマンド
一般的には hexdump コマンドの出力の方がわかりやすいと思われる。ただし hexdump コマンドは必ずインストールされているとは限らないが、od コマンドはほとんどの UNIX/Linux にデフォルトで含まれているのが強み。
>> Linuxオンラインマニュアル(man) Linux od(1)
>> Solaris10オンラインマニュアル(man) Solaris10 od(1)
>> FreeBSDオンラインマニュアル(man) FreeBSD od(1)

読み方 od (UNIXコマンド) [おー・でぃー] [おど] このエントリーをはてなブックマークに追加

"Octal Dump" の略。Octal は「8進数」の意。でも decimal も hex もダンプ出来る (^_^)