連載
» 2017年04月27日 05時00分 UPDATE

LinuxコマンドTips(106):【 cmp 】コマンド――ファイルを1バイトずつ比較する

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、ファイルを1バイトずつ比較する「cmp」コマンドです。

[西村めぐみ,@IT]
「Linux基本コマンドTips」のインデックス

連載目次

 本連載では、Linuxの基本的なコマンドについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。今回はファイルを1バイトずつ比較する「cmp」コマンドです。

cmpコマンドとは?

 ファイルを1バイト単位で比較するコマンドです。「diff」コマンド(第102回)では、テキストファイルを1行ずつ最後まで比較します。cmpの場合は1バイト単位で比較し、異なる箇所を見つけたら停止し、位置を表示して終了します。



cmpコマンドの書式

cmp [オプション] ファイル1 ファイル2

※[ ]は省略可能な引数を示しています





cmpコマンドの主なオプション

短いオプション 長いオプション 意味
-n バイト数 --bytes=バイト数 指定したバイト数のみ比較する
-i 位置 --ignore-initial=位置 指定した位置までスキップして比較を開始する
-i 位置1:位置2 --ignore-initial=位置1:位置2 1つ目のファイルの位置1まで、2つ目のファイルの位置2までスキップする
-b --print-bytes 違いのある箇所の内容を表示する(制御文字は「^」記号で示す)
-l --verbose 違いのある全ての箇所について、位置(10進数)と値(8進数)を表示する
-s --quiet/--silent 何も表示せず、ファイルが異なっているかどうか、ステータス(終了コード)だけを返す(0:違いがない 1:違いがある 2:エラーが発生した)


ファイルを1バイト単位で比較する

 「cmp ファイル1 ファイル2」でファイルを比較します。「diff」コマンドや「comm」コマンド(第99回)では、テキストファイルを1行単位で比較するのに対し、cmpコマンドはファイルを1バイト単位で比較します。

 cmpコマンドは、ファイルを先頭から1バイトずつ比較していき、違う箇所を見つけたら、その位置を表示して終了します。ファイルの末尾まで比較するとは限りません。「-b」オプションを指定すると、異なった箇所の内容も表示します。

 cmpコマンドは主にバイナリファイルの比較に使用しますが、テキストファイルの比較にも使用できます。

 コマンド実行例では2つのファイル、data1.txtとdata2.txtを比較しています(画面1画面2)。どちらもテキストファイルで、4カ所の内容が違います。5文字目が「-」と「=」、8文字目がタブと空白、12文字目も5文字目と同じ違い、2行目の先頭に「@」が入っているかいないかです。各ファイルの内容を表示する際に「od」コマンドを使いました。odコマンドはファイルを8進数でダンプ表示するコマンドです。「-t a」オプションを付けてASCII文字を表示しています(第93回)。

 「cmp -b data1.txt data2.txt」で最初に見つかった異なる箇所の位置(5バイト目)と、内容(「-」と「=」)が表示されます(画面3)。

コマンド実行例

cmp ファイル1 ファイル2

(ファイルを比較する)

cmp -b ファイル1 ファイル2画面3

(ファイルを比較し、最初に見つかった異なった箇所の内容を表示する)


画面1 画面1 data1.txtの内容 改行文字(長さ1バイト)を「nl」と表示している
画面2 画面2 data2.txtの内容
画面3 画面3 -bオプションを付けて実行したところ


比較する範囲を指定する

 比較を開始する位置は「-i」オプションで、何バイト分比較するかは「-b」オプションで指定します。

 例えば、「-i 5」で先頭5バイト分をスキップして比較すると画面4のようになります。

 data1.txtとdata2.txtを比較して、最初に異なる位置は5バイト目です。そこで「-i 5」と指定して5バイト分スキップすると、8バイト目(指定した開始位置から3バイト目)にある空白とタブ(^I)が異なると表示されました。

コマンド実行例

cmp -i バイト数 ファイル1 ファイル2

(先頭から指定したバイト数スキップして比較する)(画面4

cmp -n バイト数 ファイル1 ファイル2

(指定したバイト数だけ比較する)(画面5


画面4 画面4 先頭5バイト分をスキップして実行した結果
画面5 画面5 ファイルごとに比較開始位置を決めて実行した結果

 data1.txtの17バイト目から5文字分と、data2.txtの18バイト目から5文字分であれば両者とも「Apple」で共通になるはずです。

 試してみましょう。「-i 16:17」で1つ目のファイルは16バイト分をスキップ、2つ目のファイルは17バイト分をスキップして、「-n 5」で5バイト分比較します。異なる箇所がないため、結果には何も表示されません(画面5)。



違っている箇所を全て表示する

 「-l」オプションで、異なる箇所を全て表示します。2行目は「Apple」と「@Apple」という内容なので、17バイト目以降は全て異なるという結果になりました(画面6)。さらに、2つのファイルは長さが異なるため、先にdata1.txtでファイルの終端に到達したと表示されています。

コマンド実行例

cmp -l ファイル1 ファイル2

(ファイルを比較し、異なる箇所を全て表示する)

cmp -lb ファイル1 ファイル2

(異なる箇所全てとその箇所の内容を表示する)(画面6


画面6 画面6 異なる箇所を全て表示した


筆者紹介

西村 めぐみ(にしむら めぐみ)

PC-9801NからのDOSユーザー(LinuxはPC-486DXから)。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。のち退社し、ライターとして活動。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。


Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。