以前、改行コードを調べたことの続きです。 ファイルの内容を 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 bitc
printable character or backslash escaped[SIZE]
signed decimal, SIZE bytes per integerf[SIZE]
floating point, SIZE bytes per integero[SIZE]
octal, SIZE bytes per integeru[SIZE]
unsigned decimal, SIZE bytes per integerx[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
タイプのオプションの後ろに a
か z
をつけると表示可能な文字を行の後ろに表示してくれるようです。
$ 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
終わり
数年前にも調べたことがあったのですが、数日前にも調べなおしてしまったので、書いてみました。