ターミナルで作業していると、「このファイルの中身をちょっと見たい」「ログの最後だけ確認したい」「巨大なファイルを開いてスクロールしたい」といった場面が何度も出てきます。そんなときに使うのが cat・less・head・tail という4つのコマンドです。どれも「ファイルの中身を確認する」ためのものですが、得意なことが少しずつ違います。この記事では、それぞれの基本的な使い方と主要オプション、そして場面に応じた使い分けを、実際に打てるコマンド例とともに解説します。GNU coreutils(Linux の標準)を前提に、macOS(BSD 系)との違いにも触れていきます。
目次
4つのコマンドの役割を最初に整理する
細かい使い方に入る前に、それぞれが何を得意とするのかを押さえておくと、あとの理解がぐっと楽になります。ざっくり言うと、cat は中身をまるごと出力する、less は大きなファイルをスクロールしながら読む、head は先頭だけ、tail は末尾だけを見る、という役割分担です。まずは次の表で全体像をつかんでください。
| コマンド | おもな用途 |
|---|---|
cat | ファイル全体を一気に表示する。複数ファイルの連結や書き込みにも使う |
less | 大きなファイルを1画面ずつスクロール・検索しながら読む(ページャ) |
head | ファイルの先頭部分(既定で10行)だけを表示する |
tail | ファイルの末尾部分(既定で10行)だけを表示する。ログの追従にも使う |
cat:ファイル全体を表示する
cat は「concatenate(連結する)」に由来する名前で、指定したファイルの中身を標準出力(=画面)にそのまま吐き出します。もっともシンプルな使い方は、ファイル名を1つ渡すだけです。中身が短いファイルの内容をさっと確認したいときに向いています。
# ファイルの中身をそのまま画面に表示する
cat memo.txt
複数ファイルを連結して表示する
名前の通り、cat は複数のファイルを引数に並べると、それらを順番につなげて出力します。分割された設定ファイルやログをまとめて眺めたいときに便利です。
# part1.txt に続けて part2.txt の中身を表示する
cat part1.txt part2.txt
行番号を付けて表示する -n
ソースコードや設定ファイルを見るときに、-n を付けると各行の先頭に行番号が振られます。「何行目でエラーが出ている」といった話をするときに重宝します。空行を除いて番号を振りたい場合は -b を使います。
# すべての行に行番号を付けて表示する
cat -n script.sh
# 空行には番号を付けず、中身のある行だけ番号を振る
cat -b script.sh
cat でよく使うオプションを表にまとめておきます。
| オプション | 意味 |
|---|---|
-n | すべての行に行番号を付ける |
-b | 空行を除いて、中身のある行だけに行番号を付ける |
-A | タブや改行など不可視文字を記号で可視化する(BSD/macOS では -e と -t の組み合わせ) |
-s | 連続する空行を1行にまとめて表示する |
リダイレクトで書き込む・追記する
cat は表示だけでなく、シェルのリダイレクト機能と組み合わせてファイルへの書き込みにも使えます。> は指定したファイルを新規作成(既存なら上書き)してそこへ出力を流し込み、>> は既存ファイルの末尾に追記します。入力元を省いて cat > ファイル名 と打つと、キーボードから入力した内容をそのままファイルに書き込めます(入力を終えるには Ctrl + D を押します)。
# 2つのファイルを連結して1つのファイルにまとめる
cat header.txt body.txt > page.txt
# 既存ファイルの末尾に追記する(上書きしない)
cat footer.txt >> page.txt
# キーボードから入力した内容をファイルに書き込む(Ctrl + D で終了)
cat > note.txt
複数行のテキストをまとめて書き込みたいときは、ヒアドキュメントという書き方が便利です。<< のあとに終端を示す目印(ここでは EOF)を指定し、その目印だけの行が現れるまでの内容を入力として扱います。設定ファイルをスクリプトから生成するときなどによく使われます。
# EOF が現れるまでの複数行を config.txt に書き込む
cat > config.txt << EOF
host=localhost
port=8080
EOF
less:大きなファイルをスクロールして読む
数千行あるログや長い設定ファイルを cat で表示すると、画面が一気に流れてしまって肝心の部分を読めません。そこで使うのが less です。ファイルを1画面ずつ表示し、キー操作でスクロールしたり検索したりできる「ページャ」と呼ばれるツールです。ファイル全体をメモリに読み込まずに扱うため、巨大なファイルでも軽快に開けるのが特徴です。
# access.log を less で開く
less access.log
# 行番号を表示しながら開く
less -N access.log
less を起動したあとは、次のキー操作で自在に移動・検索できます。とりあえず「スペースで進む」「q で終了」「/ で検索」の3つを覚えておけば、日常の用途はほぼ足ります。
| キー操作 | 動作 |
|---|---|
スペース / f | 1画面ぶん先へ進む |
b | 1画面ぶん前へ戻る |
矢印キー / j k | 1行ずつ下・上に移動する |
g | ファイルの先頭へ移動する |
G | ファイルの末尾へ移動する |
/文字列 | 下方向に文字列を検索する |
?文字列 | 上方向に文字列を検索する |
n / N | 次の / 前の検索結果へ移動する |
q | less を終了する |
ログをリアルタイムで追う +F
less でファイルを開いたまま F を押すと、ファイルの末尾に張り付き、新しく追記された内容を自動で表示し続けるモードに入ります。起動時に +F オプションを付けても同じ状態で開けます。ログを監視しながら、必要になったら Ctrl + C でいったん追従を止めて上にスクロールして調べる、といった使い方ができるのが強みです。これは後述する tail -f に近い動きですが、そのまま検索やスクロールに戻れる点で less のほうが柔軟です。
# 末尾に追従しながらログを開く(Ctrl + C で追従を止められる)
less +F access.log
なお、less とよく似た古いページャに more があります。more は基本的に前方(下)へしか進めず、後戻りや検索の機能が限られています。less は「more よりできることが多い」という洒落から名付けられた後発ツールで、上下どちらへも移動でき検索も強力です。特別な理由がなければ less を使えば十分です。
head:先頭だけを表示する
head はファイルの先頭部分だけを取り出して表示します。オプションを付けなければ先頭10行が表示されます。ログやCSVの冒頭がどうなっているか、ファイルの形式をちらっと確認したいときに向いています。表示する行数を変えたいときは -n に行数を渡します。
# 先頭10行を表示する(既定)
head data.csv
# 先頭5行だけ表示する
head -n 5 data.csv
# 先頭200バイトだけ表示する
head -c 200 data.csv
-c を使うと行ではなくバイト数で先頭を切り出せます。GNU coreutils では head -5 data.csv のように -n を省いて数字だけ渡す書き方もできますが、環境によっては通らないため、迷ったら -n を付けておくと確実です。
tail:末尾だけを表示する
tail は head の逆で、ファイルの末尾10行を表示します。ログは新しい情報がファイルの末尾に追記されていくため、「最近何が起きたか」を確認するには tail がぴったりです。行数の指定は head と同じく -n で行います。
# 末尾10行を表示する(既定)
tail error.log
# 末尾50行を表示する
tail -n 50 error.log
# 11行目以降をすべて表示する(+ を付けると行番号起点になる)
tail -n +11 data.csv
-n に + を付けて +11 のように書くと、「11行目から最後まで」という意味になります。ヘッダー行を飛ばして中身だけ見たいときなどに使えます。
ログをリアルタイムで監視する -f
tail でもっともよく使われるのが -f(follow)オプションです。これを付けると tail は終了せず、ファイルに新しい行が追記されるたびに、その内容を画面へ流し続けます。アプリケーションのログを見ながら動作を確認する、いわゆる「ログの垂れ流し監視」の定番です。監視を止めるには Ctrl + C を押します。
# ログに追記される内容をリアルタイムで表示し続ける
tail -f access.log
# 直近20行を表示してから追従を始める
tail -n 20 -f access.log
似たオプションに -F(大文字)があります。-f は開いたファイルを追い続けますが、ログのローテーション(古いログが別名に退避され、新しい空ファイルが同じ名前で作り直される処理)が起きると、退避された古いファイルを見続けてしまいます。-F はファイル名を監視し、作り直された新しいファイルへ自動で切り替えてくれるため、ローテーションするログを長時間監視するなら -F のほうが安全です。なお -F は GNU coreutils の tail の機能で、macOS 標準の tail にも同名のオプションがありますが挙動が異なる場合があるため、環境に応じて確認してください。
tail は複数ファイルをまとめて監視することもできます。ファイル名を並べて渡すと、それぞれの末尾を ==> ファイル名 <== という見出し付きで表示します。
# 2つのログを同時に監視する(どちらに追記されても表示される)
tail -f access.log error.log
パイプで組み合わせて絞り込む
これらのコマンドは、パイプ(|)で他のコマンドとつなぐと真価を発揮します。パイプは「左のコマンドの出力を、右のコマンドの入力へ渡す」仕組みです。たとえばログから 404 を含む行だけを取り出し、そのうち先頭の数件だけを見る、といった処理が1行で書けます。
# access.log から 404 を含む行を抜き出し、先頭10件だけ表示する
cat access.log | grep 404 | head
# 上と同じことは、cat を使わず grep に直接ファイルを渡しても書ける
grep 404 access.log | head
# 末尾100行の中から error を含む行だけ表示する
tail -n 100 app.log | grep error
1つ目の例のように cat ファイル | ... と書くこともできますが、単に1つのファイルを渡すだけなら grep 404 access.log のように直接ファイル名を指定するほうが無駄がありません(cat をこのように挟むのは「Useless Use of Cat」と呼ばれ、避けられることが多いです)。複数ファイルをつなげてから処理したいときや、パイプの流れを直感的に書きたいときには cat を先頭に置く書き方が役立ちます。
場面ごとの使い分け
最後に、どのコマンドをいつ使うかを整理しておきます。ファイルが小さく、全体をさっと見たいだけなら cat が手軽です。行数が多くてスクロールや検索が必要になるなら less に切り替えます。ファイルの先頭だけ(形式やヘッダーの確認)でよければ head、末尾だけ(直近のログや処理結果)でよければ tail を使います。そして、動き続けているログをリアルタイムで追いたいときは tail -f、もしくは検索やスクロールにも戻りたいなら less +F が向いています。
この4つは覚えることこそ多く見えますが、実際に日常で打つのは cat file・less file・head file・tail -f file といったごく基本的な形がほとんどです。まずはこの形を手に馴染ませ、行数指定や検索といったオプションは必要になったときに少しずつ足していくとよいでしょう。ファイルの中身を確認する作業が快適になれば、ターミナルでの調査やデバッグのスピードは大きく変わってきます。