Linux コマンドラインによるファイル比較

LinuxBeginner
オンラインで実践に進む

はじめに

Linux 環境において、ファイルを比較することはシステム管理者や開発者にとって一般的な作業です。comm コマンドは、ユーザーが 2 つのソート済みのテキストファイルを行ごとに比較し、それらの間の一意の行と共通の行を特定することができる強力なツールです。

この実験 (Lab) では、comm コマンドを使用してテキストファイルを分析する方法を案内します。テストファイルを作成する方法、それらの内容を比較する方法、および比較結果から特定の情報を抽出する方法を学びます。この実験 (Lab) の終わりまでに、Linux でのファイル比較タスクにこの多機能なコマンドをどのように使用するかをしっかりと理解するようになります。

テキストファイルを準備する

comm コマンドを使用する前に、作業対象となるサンプルのテキストファイルを作成する必要があります。このステップでは、一般的な Linux コマンドのリストを含む 2 つのテキストファイルを作成します。

まず、ファイルを整理するための作業ディレクトリを作成しましょう。

mkdir -p ~/project/comm-lab
cd ~/project/comm-lab

次に、Linux コマンドのリストを含む最初のテキストファイル commands1.txt を作成しましょう。

echo -e "ls\ncd\npwd\nmkdir\ntouch\ncomm\nsed\nawk" | sort > commands1.txt

このコマンドは以下のことを行います。

  • echo -e は、バックスラッシュエスケープを解釈してテキストを出力します (\n は改行を作成します)。
  • コマンドのリストはパイプ (|) を使用して sort コマンドに渡され、項目がアルファベット順にソートされます。
  • ソートされた出力は、リダイレクト (>) を使用して commands1.txt という名前のファイルに保存されます。

次に、少し異なるコマンドのリストを含む 2 つ目のテキストファイル commands2.txt を作成しましょう。

echo -e "ls\ncd\npwd\ncomm\ngrep\nfind\nsed" | sort > commands2.txt

ファイルが正しく作成されたことを確認するために、cat コマンドを使用してそれらの内容を表示できます。

cat commands1.txt

以下のような出力が表示されるはずです。

awk
cd
comm
ls
mkdir
pwd
sed
touch

次に、2 つ目のファイルの内容を確認しましょう。

cat commands2.txt

以下のように表示されるはずです。

cd
comm
find
grep
ls
pwd
sed

cdlspwdcommsed のような一部のコマンドは両方のファイルに含まれている一方、他のコマンドは各ファイルに固有であることに注意してください。この設定により、次のステップで comm コマンドの様々な機能を実証することができます。

基本的な comm コマンドの使用

ソート済みのテキストファイルが準備できたので、comm コマンドの基本的な使い方を探ってみましょう。comm コマンドは、2 つのソート済みのファイルを行ごとに比較し、3 つの列を出力します。

  1. 最初のファイルに固有の行
  2. 2 番目のファイルに固有の行
  3. 両方のファイルに共通の行

2 つのファイルを比較するために、基本的な comm コマンドを実行しましょう。

cd ~/project/comm-lab
comm commands1.txt commands2.txt

以下のような出力が表示されるはずです。

awk
  cd
  comm
 find
 grep
  ls
mkdir
  pwd
  sed
touch

最初は出力がわかりにくいかもしれませんが、特定の形式に従っています。

  • 列 1 (行の先頭にタブがない): commands1.txt にのみ存在する行 (awk, mkdir, touch)
  • 列 2 (行の先頭に 1 つのタブがある): commands2.txt にのみ存在する行 (find, grep)
  • 列 3 (行の先頭に 2 つのタブがある): 両方のファイルに共通の行 (cd, comm, ls, pwd, sed)

このデフォルトの出力では、すべての相違点と共通点を一度に確認できますが、タブ形式のため読みにくい場合があります。次のステップでは、comm コマンドのオプションを使用してこの出力をより使いやすくする方法を学びます。

comm オプションで列を非表示にする

comm コマンドのデフォルト出力は列形式のため、読みにくい場合があります。幸いなことに、comm は特定の列を非表示にするオプションを提供しており、必要な情報のみを抽出しやすくします。

オプションは以下の通りです。

  • -1 : 列 1 (最初のファイルに固有の行) を非表示にする
  • -2 : 列 2 (2 番目のファイルに固有の行) を非表示にする
  • -3 : 列 3 (両方のファイルに共通の行) を非表示にする

これらのオプションは組み合わせて使用することができ、興味のあるデータのみを表示することができます。

最初のファイルに固有の行を見つける

最初のファイル (commands1.txt) に固有の行のみを表示するには、オプション -2-3 を使用して列 2 と列 3 を非表示にします。

cd ~/project/comm-lab
comm -23 commands1.txt commands2.txt

出力:

awk
mkdir
touch

これらは commands1.txt にのみ出現するコマンドです。

2 番目のファイルに固有の行を見つける

同様に、2 番目のファイル (commands2.txt) に固有の行のみを表示するには、オプション -1-3 を使用します。

comm -13 commands1.txt commands2.txt

出力:

find
grep

これらは commands2.txt にのみ出現するコマンドです。

共通の行を見つける

両方のファイルに共通の行のみを表示するには、オプション -1-2 を使用します。

comm -12 commands1.txt commands2.txt

出力:

cd
comm
ls
pwd
sed

これらは両方のファイルに出現するコマンドです。

結果をファイルに保存する

これらの結果を別々のファイルに保存して、将来的な参照や処理に利用することはよく行われます。やってみましょう。

comm -23 commands1.txt commands2.txt > unique_to_file1.txt
comm -13 commands1.txt commands2.txt > unique_to_file2.txt
comm -12 commands1.txt commands2.txt > common_lines.txt

これらの新しいファイルの内容を確認しましょう。

echo "Contents of unique_to_file1.txt:"
cat unique_to_file1.txt
echo "Contents of unique_to_file2.txt:"
cat unique_to_file2.txt
echo "Contents of common_lines.txt:"
cat common_lines.txt

出力には、各ファイルに固有の行と共通の行が表示され、前のコマンドで見たものと同じになります。

これらの手法は、設定ファイルの比較、ファイルのバージョン間の差分の検索、またはデータセット間の共通要素の特定に役立ちます。

comm コマンドの実用例

comm コマンドの基本的な使い方を理解したので、実際のシナリオでの有用性を示すいくつかの実用例を見てみましょう。

例 1: 新しいエントリの検索

先週のユーザーリストと今日のユーザーリストがあるとします。どのユーザーが新規追加されたか(先週以降に追加されたか)を特定したいとします。

これらのファイルを作成しましょう。

cd ~/project/comm-lab
echo -e "user1\nuser2\nuser3\nuser4\nuser5" | sort > users_last_week.txt
echo -e "user1\nuser3\nuser5\nuser6\nuser7\nuser8" | sort > users_today.txt

新しいユーザー(users_today.txt にあるが users_last_week.txt にないユーザー)を見つけるには、以下のコマンドを実行します。

comm -13 users_last_week.txt users_today.txt

出力:

user6
user7
user8

例 2: 削除されたエントリの検索

同じファイルを使用して、先週以降に削除されたユーザーを見つけましょう。

comm -23 users_last_week.txt users_today.txt

出力:

user2
user4

例 3: comm と他のコマンドの組み合わせ

comm コマンドは、より複雑な操作を行うために他のコマンドと組み合わせることができます。たとえば、元のファイルに共通するコマンドの数を数えたい場合、以下のようにします。

comm -12 commands1.txt commands2.txt | wc -l

これは、共通の行を wc -l コマンドにパイプし、行の数を数えます。

出力:

5

これは、両方のファイルに共通するコマンドが 5 個あることを示しています。

例 4: ソートされていないファイルでの comm の使用

comm コマンドは、入力ファイルがソートされている必要があります。ソートされていないファイルで使用すると、誤った結果が得られることがあります。これを実証してみましょう。

echo -e "cat\nls\npwd\ncd" > unsorted1.txt
echo -e "ls\ncat\ngrep\npwd" > unsorted2.txt

comm を直接使用しようとすると、

comm unsorted1.txt unsorted2.txt

ファイルがソートされていないため、出力が誤解を招く可能性があります。正しいアプローチは、まずファイルをソートすることです。

comm <(sort unsorted1.txt) <(sort unsorted2.txt)

これは、プロセス置換を使用して、比較する前にファイルをその場でソートします。正しい列で適切にフォーマットされた結果が表示されるはずです。

これらの例は、comm コマンドが、変更の追跡、差分の検索、データのフィルタリングなど、さまざまなシナリオでテキストファイルを比較するための汎用性を示しています。

まとめ

この実験では、Linux の comm コマンドを使用してテキストファイルを比較し、それらの差分を特定する方法を学びました。以下は達成したことのまとめです。

  1. 基本的な Linux コマンドを使用して、比較用のソートされたテキストファイルを作成しました。
  2. 基本的な comm コマンドを使用して 2 つのファイルを比較し、その 3 列の出力形式を理解しました。
  3. 列非表示オプション (-1, -2, -3) を適用して特定の情報を抽出しました。
    • 最初のファイルに固有の行
    • 2 番目のファイルに固有の行
    • 両方のファイルに共通の行
  4. 比較結果を別々のファイルに保存し、将来的な参照に備えました。
  5. 実際のシナリオで comm を使用する実用例を調査しました。
    • 更新されたリストの新しいエントリを見つける
    • 削除されたエントリを特定する
    • より複雑な操作のために comm を他のコマンドと組み合わせる
    • ソートされていないファイルを適切に扱う

comm コマンドは、Linux でのテキストファイル比較における強力なツールです。システム管理者、開発者、データ分析者がファイル間の差分と類似点を効率的に特定することを可能にし、これは設定管理、バージョン管理、データ分析などのタスクに不可欠です。

comm とそのオプションを効果的に使用する方法を理解することで、Linux コマンドライン環境でテキストファイルを扱う際の生産性が向上します。