Ubuntu Bash でファイルの内容を 8 進数で出力しました

以前、改行コードを調べたことの続きです。 ファイルの内容を 8 進数や 16 進数で表示したかったので調べました。

環境

  • Ubuntu 16.04 LTS

準備

いくつかファイルを用意しました。 以前、改行コードの異なるファイルを用意したので、同じように作っておきます。

$ echo -ne "a\r\nb\r\nc\r\nd\r\ne\r\n" > crlf.txt
$ echo -ne "a\rb\rc\rd\re\r" > cr.txt
$ echo -ne "a\nb\nc\nd\ne\n" > lf.txt

abcde の文字と、改行コードが含まれるファイルです。

od

od - dump files in octal and other formats

man od

od コマンドを使うとファイルの内容を 8 進数で表示できるようです。

その他のフォーマットもあるようです。

format

-t, –format=TYPE

select output format or formats

man od

-t オプションで書式が指定できるようです。

TYPE is made up of one or more of these specifications:

a
named character, ignoring high-order bit

c
printable character or backslash escape

d[SIZE]
signed decimal, SIZE bytes per integer

f[SIZE]
floating point, SIZE bytes per integer

o[SIZE]
octal, SIZE bytes per integer

u[SIZE]
unsigned decimal, SIZE bytes per integer

x[SIZE]
hexadecimal, SIZE bytes per integer

man od

7 つのタイプがあるようです。

使いそうなものを見てみます。

a(named character)

$ od -t a crlf.txt
0000000   a  cr  nl   b  cr  nl   c  cr  nl   d  cr  nl   e  cr  nl
0000017
$ od -t a cr.txt
0000000   a  cr   b  cr   c  cr   d  cr   e  cr
0000012
$ od -t a lf.txt
0000000   a  nl   b  nl   c  nl   d  nl   e  nl
0000012

-a のオプションは名前付きの文字で表示してくれるようです。 CR は cr と表示してくれました。 LF は nl (new line) と表示してくれました。 このオプションは見やすいです。

c(printable character or backslash escape)

$ od -t c crlf.txt
0000000   a  \r  \n   b  \r  \n   c  \r  \n   d  \r  \n   e  \r  \n
0000017
$ od -t c cr.txt
0000000   a  \r   b  \r   c  \r   d  \r   e  \r
0000012
$ od -t c lf.txt
0000000   a  \n   b  \n   c  \n   d  \n   e  \n
0000012

-c のオプションはバックスラッシュでエスケープした文字で表示してくれるようです。 CR は \r と表示してくれました。 LF は \n と表示してくれました。 このオプションも見やすいです。

d(signed decimal)

$ od -t d crlf.txt
0000000  1644825953   224594445   168649738      658789
0000017
$ od -t d cr.txt
0000000   224529761   224660835        3429
0000012
$ od -t d lf.txt
0000000   174197345   174328419        2661
0000012

-d のオプションは 10 進数で文字を表示してくれるようです。 ちょっと見づらいです。

$ od -t d1 crlf.txt
0000000   97   13   10   98   13   10   99   13   10  100   13   10  101   13   10
0000017
$ od -t d1 cr.txt
0000000   97   13   98   13   99   13  100   13  101   13
0000012
$ od -t d1 lf.txt
0000000   97   10   98   10   99   10  100   10  101   10
0000012

サイズを指定することもできるようで、 -t d1 のように指定すると、 1 文字ごとに区切って表示してくれるようです。 これの方が少し見やすいです。 CR は 10 進数の 13 と表示してくれます。 LF は 10 進数の 10 と表示してくれます。

o(octal)

$ od -t o1 crlf.txt
0000000 141 015 012 142 015 012 143 015 012 144 015 012 145 015 012
0000017
$ od -t o1 cr.txt
0000000 141 015 142 015 143 015 144 015 145 015
0000012
$ od -t o1 lf.txt
0000000 141 012 142 012 143 012 144 012 145 012
0000012

-o のオプションは 8 進数で文字を表示してくれるようです。 CR は 8 進数の 015 と表示してくれます。 LF は 8 進数の 012 と表示してくれます。

x(hexadecimal)

$ od -t x1 crlf.txt
0000000 61 0d 0a 62 0d 0a 63 0d 0a 64 0d 0a 65 0d 0a
0000017
$ od -t x1 cr.txt
0000000 61 0d 62 0d 63 0d 64 0d 65 0d
0000012
$ od -t x1 lf.txt
0000000 61 0a 62 0a 63 0a 64 0a 65 0a
0000012

-x のオプションは 16 進数で文字を表示してくれるようです。 CR は 16 進数の 0d と表示してくれます。 LF は 16 進数の 0a と表示してくれます。

タイプのサフィックス

Adding a z suffix to any type displays printable characters at the end of each output line.

man od

タイプのオプションの後ろに az をつけると表示可能な文字を行の後ろに表示してくれるようです。

$ od -t x1a crlf.txt
0000000  61  0d  0a  62  0d  0a  63  0d  0a  64  0d  0a  65  0d  0a
          a  cr  nl   b  cr  nl   c  cr  nl   d  cr  nl   e  cr  nl
0000017
$ od -t x1z crlf.txt
0000000 61 0d 0a 62 0d 0a 63 0d 0a 64 0d 0a 65 0d 0a     >a..b..c..d..e..<
0000017

a は次の行に表示してくれました。

z は同じ行に表示してくれました。 表示可能じゃない文字 (CR や LF) は . のように表示してくれました。

a-t a のタイプと同じ内容のようでした。 だから、 -t aa と指定すると、同じ内容を 2 回表示してくれます。

$ od -t aa crlf.txt
0000000   a  cr  nl   b  cr  nl   c  cr  nl   d  cr  nl   e  cr  nl
          a  cr  nl   b  cr  nl   c  cr  nl   d  cr  nl   e  cr  nl
0000017

終わり

数年前にも調べたことがあったのですが、数日前にも調べなおしてしまったので、書いてみました。