このすみ技術ろぐ

とあるWebエンジニアが、技術や趣味について書くブログです。

【Linux】odコマンドのオフセットの基数とについて

Linuxのodコマンドは、ファイルの内を8進数で表示(ダンプ)するコマンドです。 こんな感じの結果が返ってきます。

# ファイルの内容
$ cat test.txt
abcdefg
hijklmnop
# odの実行結果
$ od test.txt
0000000 061141 062143 063145 005147 064550 065552 066554 067556
0000020 005160
0000022

odコマンドの1列目はオフセットと呼ばれるらしいのですが、何だかよくわからないので調べました。

オフセットとは

いろいろ調べた結果、Yahoo!知恵袋のわかりやすい回答にたどり着きました。

オフセットというのはファイルの頭からの距離で先頭ブロックに表示されています。
~中略~
odはデフォルトで1行に16バイト表示します
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10218784505 より

改めてodの実行結果を見ると、2行目のオフセットは、20になっていることがわかります。 8進数で20なので、確かに先頭から16バイト離れていることが確認できます。

# odの実行結果
$ od test.txt
0000000 061141 062143 063145 005147 064550 065552 066554 067556
0000020 005160
0000022

オフセットの基数を変更してみる

デフォルトでは8進数でオフセットが表現されるのですが、10進数や16進数への変更も可能です。

# 10進数でオフセットを表示する
$ od -Ad test.txt
0000000 061141 062143 063145 005147 064550 065552 066554 067556
0000016 005160
0000018
# 16進数でオフセットを表示する
$ od -Ax test.txt
000000 061141 062143 063145 005147 064550 065552 066554 067556
000010 005160
000012

ファイルの中身も進数を変更できる

odはファイルの中身を8進数で表示するコマンドですが、10進数や16進数で表現することもできます。

# オフセットもファイルの中身も10進数で表示する
$ od -d -Ad test.txt
0000000 25185 25699 26213  2663 26984 27498 28012 28526
0000016  2672
0000018
# オフセットもファイルの中身も16進数で表示する
$ od -x -Ax test.txt
000000 6261 6463 6665 0a67 6968 6b6a 6d6c 6f6e
000010 0a70
000012

さいごに

odコマンドについて理解したは良いものの、実際にこのコマンドを使いたくなるケースは、あまり思い浮かびません。 私が思いつく限りでは、以下の用途で使うのだろうと推測しています。

  1. バイナリファイルもダンプできるため、バイナリファイルの中身を解析するケースで利用する
  2. 単なるファイル内容の出力(catなど)では見分けがつかない、制御文字や隠し文字を発見したいケースで使う

補足事項

実際の用途を調べてみたのですが、以下のケースで役立つことがわかりました。

[Linux] バイナリファイルを表示する - od

『ねこの足跡R』さまの解説記事、かなり具体的でわかりやすかったです。 この場を借りてお礼申し上げます。