本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、ファイルを8進数や16進数でダンプする「hexdump」コマンドです。
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、ファイルを8進数や16進数でダンプする「hexdump」コマンドです。
「hexdump」はファイルや標準入力から受け取った内容を8進数や16進数でダンプするコマンドです。出力フォーマットを指定することも可能です。
「ダンプ(dump)」は記録などの中身をまとめて表示したり、記録したりするという意味で、「hex」は16進法を意味します。
ファイルを8進数や16進数でダンプするコマンドには、hexdumpの他に、odコマンド(連載第93回)やxxdコマンド(第254回)などがあります。
hexdump [オプション] [ファイル名...]
※[ ]は省略可能な引数を示しています。
短いオプション | 意味 |
---|---|
-b | 1バイト単位の8進数(3桁)で表示する |
-o | 2バイト単位の8進数(6桁)で表示する |
-c | 1バイト単位のASCII文字で表示する |
-C | 16進数とASCII文字で表示する |
-d | 2バイト単位の10進数(5桁)で表示する |
-x | 2バイト単位の16進数(4桁)で表示する(デフォルト) |
-e フォーマット | 表示用のフォーマット文字列を指定(書式記号には""を付け、全体は''で囲む) |
-f ファイル | フォーマット文字列を書いたファイルを指定する |
-n バイト数 | 表示するバイト数を指定する(「-n 20」で先頭の20バイトを表示、※1) |
-s バイト数 | 表示する開始位置(オフセット)を指定する(※1、※2) |
-v | 全ての入力内容を出力する(-vを付けなかった場合、直前の行と同じ内容と同じ内容を「*」記号1文字でまとめる) |
※1 -nと-sは先頭に0xを付けた場合16進数、0を付けた場合は8進数という指定になる。
※2 数字の末尾に小文字の「k」「m」を付けた場合、それぞれ1024倍、1048576倍を意味する。
文字列 | 意味 |
---|---|
%桁数_ad | 次に表示される文字のファイル内の位置(オフセット)を、指定した桁数の10進数で表示 |
%桁数_ao | 次に表示される文字のファイル内の位置(オフセット)を、指定した桁数の8進数で表示 |
%桁数_ax | 次に表示される文字のファイル内の位置(オフセット)を、指定した桁数の16進数で表示 |
%_A[dox] | 最後の位置を10進数(%A_d)か8進数(%A_o)、16進数(%A_x)で表示 |
%c | デフォルト文字セット(ASCII文字列)で出力(※3) |
%_c | デフォルト文字セット(ASCII文字列)で出力、表示できない文字は3桁の8進数で表示 |
%_p | デフォルト文字セット(ASCII文字列)で出力、表示できない文字は「.」で表示 |
%_u | ASCII文字列で出力、制御コードは「nul」や「lf」などの文字で表し、0xff以降の文字は16進数で表示する |
%d | 10進数(※4) |
%o | 8進数(※4) |
%X, %x | 16進数(%Xは大文字、%xは小文字で表示)(※4) |
\t | タブ |
\n | 改行 |
\r | 復帰 |
\f | フォームフィード(改ページ) |
\0 | NUL文字 |
※3 表示できない文字があると表示が乱れる。
※4 デフォルトは4バイト単位。1バイトまたは2バイト単位に設定可能。桁数も指定できる。0埋めで3桁の8進数(%o)ならば「%03o」のようにする。また、double型用の%E、%e、%f、%G、%gも使用可能。
「hexdump ファイル名」で、指定したファイルを16進数でダンプします。各行の先頭には表示位置(オフセット)を16進数で表示します。最後の行のオフセットは、ファイルのサイズを16進数で表示した数値になります。
「hexdump -C ファイル名」では、オフセットや16進数と合わせて、右側にダンプの内容をASCII文字で表示します。ASCII文字で表示できない部分は「.」に置き換えます。この場合、1行に16バイト分のダンプ結果を表示します。
オプションなしで実行した場合は、2バイト単位で処理を進めます。このとき最下位のバイトから順番に出力します(リトルエンディアン)。「-C」オプションを付けた場合、ASCII文字と同じ1バイト単位で処理を進めます(※5)。
画面1では、headコマンドでファイルの冒頭部分を表示しています。画面2ではテキストファイルをダンプしました。
※5 例えばファイルの内容が数字の「1234」だった場合、オプションがないと「3231 3433 000a」と表示する。32は数字「2」の文字コード、31は数字「1」の文字コード、0aはLinuxの改行コード(LF)。オプション「-C」を付けると「31 32 33 34 0a」と表示する。
hexdump ファイル名
(ファイルを2バイト単位、16進数でダンプする)
hexdump -C ファイル名
(ファイルを1バイト単位、16進数とASCII文字でダンプする)
ファイルの先頭部分だけをダンプしたい場合は、「-n バイト数」で指定します(画面3)。ダンプの開始位置も「-s バイト数」で指定できます。
hexdump -n 80 ファイル名
(先頭から80バイト分ダンプする)
hexdump -s 100 -n 80 ファイル名
(100バイト目から80バイト分ダンプする)
hexdump -s 65 -C sample.txt
(sample.txtを65バイト目からダンプする)(画面3)
hexdump -s 65 -n 5 -C sample.txt
(sample.txtを65バイト目から5バイト分ダンプする)(画面3)
hexdumpは、直前の行と同じ内容の出力を次の行でも繰り返す場合、複数行を省略して「*」とだけ表示します。「-v」オプションを指定すると、繰り返し部分も全て出力します(画面4)。
hexdump -v ファイル名
(繰り返し部分を省略せずに出力する)
hexdump -v -C sample2.txt
(sample2.txtを16進数とASCII文字で、繰り返し部分を省略せずに出力する)(画面4)
「-e」オプションを指定することで、hexdumpの出力フォーマットを変更できます(画面5)。まず1行当たりの繰り返し数を指定し、その後、「/」で区切ってバイト数を書きます。その後、フォーマット文字列を指定します。「繰り返し数/バイト数 フォーマット」という書式全体を、シングルクオート('')で囲んでください。なお、フォーマット部分はダブルクオート("")で囲みます。
例えば「繰り返し数を指定せず、1バイト単位で、0埋め3桁の8進数で出力」であれば「-e '/1 "%08d"'」と指定します。3桁で出力した後に空白を入れたいのであれば「-e '/1 "%08d "'」、タブ区切りにしたいのであれば「-e '/1 "%08d\t"'」のようにします。
改行を入れたい場合は、2番目のフォーマットとして「-e '"\n"'」を追加します。この場合、「-e '8/1 "%08d\t"' -e '"\n"'」のように、繰り返し数も指定しましょう。
以下のコマンド実行例では4番目のみ改行し、それ以外は改行しません。「0埋め3桁」とは、例えば1桁の8進数「3」を「003」と表示する指定です。
hexdump -e '/1 "%03o"' sample.txt
(1バイト単位、0埋め3桁の8進数で出力)
hexdump -e '/1 "%03o "' sample.txt
(1バイト単位、0埋め3桁の8進数+空白で出力)
hexdump -e '/1 "%03o\t"' sample.txt
(1バイト単位、0埋め3桁の8進数+タブで出力)
hexdump -e '8/1 "%03o\t"' -e '"\n"' sample.txt
(1バイト単位、0埋め3桁の8進数+タブで出力、8回出力ごとに改行する)(画面5)
行頭にファイル内の位置(オフセット)を出力したい場合は「%桁数_ad」「%桁数_ao」「%桁数_ax」のいずれかを使用します。それぞれ10進数、8進数、16進数で出力します。例えば「0埋め6桁の10進数」であれば「-e '"%06_ad"'」とします。
先ほど4番目のコマンド実行例(タブと改行を入れたフォーマット)にオフセットを追加すると次のコマンド実行例になります。2種類の書式がありますが、どちらの書き方でも同じ結果になります。
hexdump -e '"%06_ad "' -e '8/1 "%03o\t"' -e '"\n"' sample.txt
(オフセットを0埋め6桁の10進数で出力し、1バイト単位、0埋め3桁の8進数+タブで出力、これを8回出力するごとに改行する)
hexdump -e '"%06_ad " 8/1 "%03o\t"' -e '"\n"' sample.txt(画面5)
オフセットとダンプに加えて、ASCII文字も出力したい場合は、「%c」「%_c」「%_p」「%_u」のいずれかを使用します(画面6)。それぞれ、表示できない文字の扱いが異なります(フォーマット文字列を参照)。ここでは「%_p」を使用しています。「%_p」は、表示できない文字を「.」1文字に出力します。
hexdump -e '"%06_ad " 8/1 "%03o\t"' -e '"\t" "%_p"' -e '"\n"' sample.txt
(オフセットを0埋め6桁の10進数で出力し、1バイト単位、0埋め3桁の8進数+タブで出力、ASCII文字を出力、これを8回出力するごとに改行する)(画面6)
さらに、最後のオフセットを出力したい場合は「%_Ad」「%_Ao」「%_Ax」のいずれかを追加します。この部分は他の指定とは独立して、「-e '"%06_Ao\n"'」(0埋め6桁の8進数で出力して改行)や「-e '"%_Ad\n"'」(10進数で出力して改行)のように指定します。どこに指定しても、全ての出力が終わった後、一度だけ出力します。
hexdump -e '"%06_Ad\n"' -e '"%06_ad " 8/1 "%03o\t"' -e '"\t" "%_p"' -e '"\n"' sample.txt
(最後のオフセットを0埋め6桁の10進で出力し改行する)
hexdump -e '"(%_Ad byte)\n"' -e '"%06_ad " 8/1 "%03o\t"' -e '"\t" "%_p"' -e '"\n"' sample.txt
(最後のオフセットを10進数で「(n byte)」と出力し改行する、※6)(画面6)
※6 「-s」や「-n」で表示範囲を指定しなかった場合は、ファイルのサイズを指定できるが、「-s」や「-n」を指定した場合はその分だけサイズがずれてしまう。
「-e」を使わずに出力フォーマットを指定することもできます。ファイルに出力フォーマットの文字列を保存し、「-f ファイル名」と指定します(画面7、画面8)。
ファイルには「-e」の指定1つを1行に書きます。シングルクオートは省略できます。「#」から始まる行はコメントです。
hexdump -f フォーマットファイル名 処理ファイル名
(出力フォーマットをファイルから指定する)
#末尾にバイト数を出力(-sや-nを指定しないで使用) "(%_Ad byte)\n" "%06_ad " 8/1 "%03o\t" "\t" "%_p" "\n"
8/1 "%04_ad:%-5_u" "\n"
西村 めぐみ(にしむら めぐみ)
PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。
Copyright © ITmedia, Inc. All Rights Reserved.