Linuxシステムを操作する際、テキストファイルやログファイルの内容を素早く確認したい場面は頻繁に発生します。
数百万行に及ぶような巨大なファイルをテキストエディタで開こうとすると、メモリを大量に消費し、システムの動作が重くなってしまうリスクがあります。
そのような場合に非常に便利なのが、ファイルの特定の部分だけを効率的に抽出して表示するheadコマンドとtailコマンドです。
この記事では、Bash環境においてこれら2つのコマンドを使いこなし、作業効率を劇的に向上させるための手法を詳しく解説します。
ファイルの先頭を表示するheadコマンドの基本
headコマンドは、その名の通りファイルの内容を先頭から順に表示するためのツールです。
引数にファイル名を指定するだけで、デフォルトでは最初の10行が表示される仕組みになっています。
行数を指定して表示する方法
表示する行数を自由に変更したい場合は、-nオプションを使用します。
例えば、設定ファイルの冒頭にあるコメントアウトされた説明文だけを読みたい場合に、5行だけ表示させるといった使い方が一般的です。
# ファイルの先頭5行を表示する
head -n 5 sample_data.txt
Line 1: データの概要
Line 2: 作成日: 2026-05-10
Line 3: 著者: テクニカルライター
Line 4: バージョン: 2.1
Line 5: ライセンス: MIT
また、-nを省略してhead -5 sample_data.txtのように記述することも可能ですが、可読性の観点からは明示的にオプションを記述することが推奨されます。
バイト単位で表示を制御する
テキストデータではなく、バイナリファイルの一部を確認したい場合や、厳密なデータサイズで切り出したい場合には、-cオプションが役立ちます。
このオプションを使用すると、行数ではなく指定したバイト数分だけを先頭から抽出できます。
# 先頭の100バイトを表示する
head -c 100 log_file.log
データ解析の現場において、ファイルヘッダーの構造を確認する際などに重宝される機能の一つです。
複数のファイルを同時に確認する
headコマンドには複数のファイルを引数として渡すことができ、それぞれのファイルの先頭部分を一度に確認できます。
複数のファイルを指定した場合、出力結果には各ファイルの境界を示すヘッダーが自動的に挿入されます。
# 複数のファイルの先頭3行をそれぞれ表示する
head -n 3 file1.txt file2.txt
==> file1.txt <==
file1 row 1
file1 row 2
file1 row 3
==> file2.txt <==
file2 row 1
file2 row 2
file2 row 3
もしこのヘッダーを表示したくない場合は、-q(quiet)オプションを併用することで、純粋な内容のみを出力させることが可能です。
ファイルの末尾を表示するtailコマンドの活用法
一方で、ファイルの末尾部分を表示するのがtailコマンドです。
ログファイルのように、常に新しい情報が末尾に追記されていく形式のファイルを確認する際に、最も威力を発揮します。
最新の情報を素早く確認する
tailコマンドもheadと同様に、デフォルトではファイルの末尾から10行分を表示します。
-nオプションを使用することで、表示する行数を任意に変更できます。
# ファイルの末尾から最後から20行を表示する
tail -n 20 system_error.log
直近で発生したエラーメッセージを確認する際など、トラブルシューティングにおける必須の操作と言えるでしょう。
リアルタイムでのログ監視(-fオプション)
tailコマンドの最も強力な機能の一つが、ファイルの更新をリアルタイムで監視する-fオプションです。
このオプションを付けて実行すると、コマンドは終了せずに待機状態となり、ファイルに新しい行が追加されるたびにその内容を逐次画面に出力します。
# ログの更新をリアルタイムで追跡する
tail -f /var/log/syslog
開発中のアプリケーションの挙動を確認したり、サーバーへのアクセス状況をライブでモニタリングしたりする際に欠かせないテクニックです。
監視を終了したい場合は、キーボードのCtrl + Cを押すことでコマンドを停止できます。
特定の行以降をすべて表示する
tailコマンドの少し特殊な使い方として、-n +数値という記法があります。
これは「末尾から数える」のではなく、「指定した行目から最後までのすべてを表示する」という意味になります。
# 11行目から最後までを表示する
tail -n +11 data_list.csv
例えば、1行目にヘッダーがあるCSVファイルにおいて、2行目以降のデータ本体のみを処理したい場合などに非常に便利です。
headとtailを組み合わせた応用テクニック
これらのコマンドは単体でも有用ですが、パイプ(|)を使って組み合わせることで、さらに高度な操作が可能になります。
Bashの強力なパイプライン機能を活用し、特定の範囲をピンポイントで抽出する方法を見ていきましょう。
特定の行の範囲を抽出する
「11行目から20行目までを表示したい」といった中間の範囲を指定して表示したい場合、headとtailを連結させます。
まずheadコマンドで先頭から20行を取り出し、その結果をtailコマンドに渡して末尾の10行を取得するという論理です。
# ファイルの11行目から20行目までを表示する
head -n 20 sample.txt | tail -n 10
この手法を応用すれば、どんなに巨大なファイルであっても、特定の位置にあるデータだけを即座に取り出すことができます。
他のコマンドと連携させる
grepコマンドで検索した結果の先頭だけを確認したり、lsコマンドで出力されたファイルリストの最新分だけを表示したりすることも容易です。
# エラーが含まれる行のうち、最新の5件だけを表示する
grep "ERROR" application.log | tail -n 5
このように、headとtailは他のコマンドの出力を制御するフィルターとしても極めて優秀です。
headとtailの主なオプション比較表
頻繁に使用するオプションを以下の表にまとめました。
| オプション | headコマンドの動作 | tailコマンドの動作 |
|---|---|---|
-n [行数] | 先頭から指定行を表示 | 末尾から指定行を表示 |
-c [バイト数] | 先頭から指定バイトを表示 | 末尾から指定バイトを表示 |
-f | 利用不可 | 更新をリアルタイム監視 |
-q | ファイル名のヘッダーを非表示 | ファイル名のヘッダーを非表示 |
-v | 常にファイル名のヘッダーを表示 | 常にファイル名のヘッダーを表示 |
より高度な表示制御とパフォーマンス
2026年現在のLinux環境では、非常に大きなログファイルを扱うことが一般的となっていますが、headやtailは内部的に非常に効率的な処理を行っています。
ファイル全体を読み込むことなく、ファイルシステムのポインタを直接操作して先頭や末尾にアクセスするため、数TB(テラバイト)クラスのファイルに対しても一瞬で処理を完了させることができます。
ただし、tailのリアルタイム監視(-f)を行っている最中に、ログローテーション(ファイルの切り替え)が発生する場合があることに注意してください。
そのような場合は、-F(大文字)オプションを使用することで、ファイルが一度削除されて再作成された場合でも、自動的に新しいファイルを再オープンして監視を継続できます。
# ログローテーションに対応した監視
tail -F logrotate_managed.log
安定したシステム運用のためには、この-Fオプションの存在を覚えておくと非常に有益です。
まとめ
Linuxにおけるファイルの確認作業において、headとtailはシンプルながらも代えの効かない重要なコマンドです。
headはファイルの構造を把握するために使い、tailは最新の更新内容を追跡するために使うという役割分担を意識しましょう。
これらをパイプで組み合わせることで、自由自在にテキストデータを操作できるようになります。
日常的な作業の中でこれらのオプションを意識的に使い分け、よりスマートなサーバー管理や開発作業を実現してください。
まずは自分の手元にある環境で、ログファイルの監視や特定行の抽出を試してみることから始めてみるのが上達への近道です。
