Ubuntuのhead・tailでファイルの先頭・末尾を表示する方法

コマンド

ファイルの中身を確認したいとき、catで全行表示するのは長いファイルでは不便です。headは先頭N行、tailは末尾N行だけを素早く表示するコマンドで、Linuxの日常作業では毎日使うほど重要なツールです。

特にtail -fはサーバーログをリアルタイムで追いかけるときに欠かせません。VPSを運用するなら必ず覚えておきましょう。

本記事では、Ubuntu 24.04 LTS(Docker公式イメージ ubuntu:24.04)で実際に動かした結果をもとに、head・tailの使い方を体系的に解説します。

この記事のポイント

  • headはデフォルトで先頭10行、tailは末尾10行を表示(ubuntu:24.04 で実測確認)
  • -n 数字で行数を指定、-c 数字でバイト数を指定できる
  • tail -fでログファイルをリアルタイム追尾できる(VPS運用に必須)
  • Ubuntu 22.04のcoreutils 8.32 → Ubuntu 24.04でcoreutils 9.4に更新済み(実測)
  • -n +数字はtailの特殊構文で「N行目以降をすべて表示」できる

目次

  1. head・tailとは何か
  2. 基本的な使い方
  3. headコマンドのオプション詳解
  4. tailコマンドのオプション詳解
  5. tail -f でログをリアルタイム追尾する
  6. 複数ファイルを同時に表示する
  7. 実践的な活用例
  8. よくあるエラーと解決策
  9. まとめ

head・tailとは何か

headtailは、GNU coreutilsパッケージに含まれるコマンドです。Ubuntu 24.04 LTSには最初からインストールされており、追加インストールは不要です。

head・tailの役割

  • head:ファイルの「先頭」から指定した行数(またはバイト数)を表示する
  • tail:ファイルの「末尾」から指定した行数(またはバイト数)を表示する
  • どちらもcatより高速で、大きなファイルの一部確認に最適

Ubuntu 24.04ではheadtailともに/usr/bin/に配置されており、GNU coreutils 9.4(Ubuntu 22.04は8.32)が使われています。




ubuntu@linuxlab: ~
$ which head && which tail
/usr/bin/head
/usr/bin/tail
$ head –version | head -1
head (GNU coreutils) 9.4
$ dpkg -s coreutils | grep Version
Version: 9.4-3ubuntu6.2
/etc/passwd・/etc/os-releaseへのhead適用(実測)
/etc/passwd・/etc/os-releaseへのhead適用(実測)

基本的な使い方

まず20行のテストファイルを作って、デフォルト動作を確認しましょう。

手順1:テストファイルを用意する




ubuntu@linuxlab: ~
$ seq 1 20 > /tmp/test.txt
$ wc -l /tmp/test.txt
20 /tmp/test.txt

seq 1 20で1〜20の数字を生成し、/tmp/test.txtに書き込みます。

手順2:headで先頭を表示する




ubuntu@linuxlab: ~
$ head /tmp/test.txt
1
2
3
4
5
6
7
8
9
10

オプションなしではデフォルトで先頭10行が表示されます。

手順3:tailで末尾を表示する




ubuntu@linuxlab: ~
$ tail /tmp/test.txt
11
12
13
14
15
16
17
18
19
20

こちらもデフォルトで末尾10行が表示されます。20行ファイルなら11〜20行目が返ってきます。

headとtailのデフォルト動作(実測・ubuntu:24.04)
headとtailのデフォルト動作(実測・ubuntu:24.04)

headコマンドのオプション詳解

①-n:表示する行数を指定する

最もよく使うオプションです。-nの後に行数を指定します。




ubuntu@linuxlab: ~
$ head -n 5 /tmp/test.txt
1
2
3
4
5

-nは省略してhead -5と書くことも可能です(短縮形)。

②-n -N:末尾N行を除いて表示する(マイナス指定)

headならではの特殊な使い方です。-n -3のようにマイナスを付けると「末尾3行を除いた先頭」を表示します。




ubuntu@linuxlab: ~
$ head -n -3 /tmp/test.txt
1
2
(中略)
17
(18・19・20行目は除外される)

20行ファイルでhead -n -3を実行すると、末尾3行(18・19・20)を除いた1〜17行が表示されます。ubuntu:24.04で実測確認しています。

③-c:バイト数で指定する

行ではなくバイト数で指定したい場合は-cを使います。




ubuntu@linuxlab: ~
$ printf ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ\n1234567890\nLinux Ubuntu\n’ > /tmp/bytes_test.txt
$ head -c 10 /tmp/bytes_test.txt
ABCDEFGHIJ
$ tail -c 12 /tmp/bytes_test.txt
inux Ubuntu

ファイルは51バイト(26文字+改行+10文字+改行+12文字+改行)です。head -c 10で先頭10バイト「ABCDEFGHIJ」が、tail -c 12で末尾12バイト「inux Ubuntu\n」が返ってきます。ubuntu:24.04で実測確認済みです。

tailコマンドのオプション詳解

①-n:末尾から指定行数を表示する




ubuntu@linuxlab: ~
$ tail -n 5 /tmp/test.txt
16
17
18
19
20

②-n +N:N行目以降をすべて表示する(プラス指定)

tailの-n +Nは「N行目以降をすべて表示」する特殊な使い方です。ヘッダー行をスキップしてCSVの本体を取り出したいときに便利です。




ubuntu@linuxlab: ~
$ tail -n +15 /tmp/test.txt
15
16
17
18
19
20

20行ファイルでtail -n +15を実行すると、15行目から最後まで(15〜20行)が表示されます。ubuntu:24.04で実測確認済みです。

head・tailの-nオプション各種(実測・ubuntu:24.04)
head・tailの-nオプション各種(実測・ubuntu:24.04)

③-c:バイト数で末尾を指定する

headと同様に-cでバイト数指定が可能です。ログの末尾を軽く確認したいときに役立ちます。

tail -f でログをリアルタイム追尾する

VPS運用で特に役立つのがtail -f(–follow)です。ファイルへの追記をリアルタイムで監視し続けるため、アプリケーションログやWebサーバーのアクセスログを確認するときに使います。

手順1:tail -f の基本構文




ubuntu@linuxlab: ~
$ tail -f /var/log/nginx/access.log
192.168.1.1 – – [13/Jun/2026:12:00:01 +0000] “GET / HTTP/1.1” 200 612
192.168.1.2 – – [13/Jun/2026:12:00:05 +0000] “GET /index.html HTTP/1.1” 200 1024
(ファイルに行が追記されるたびにリアルタイムで表示される)
^C
(Ctrl+C で終了)

注意

tail -fはCtrl+Cで終了するまで動き続けます。バックグラウンドで実行したい場合はtail -f /var/log/app.log &として、終了はkill %1などで行います。

手順2:tail -f を実際に試す(Dockerコンテナで実測)

ubuntu:24.04のDockerコンテナ内で実際に動作を確認しました。




ubuntu@linuxlab: ~
$ echo ‘初期行1’ > /tmp/follow_test.log
$ echo ‘初期行2’ >> /tmp/follow_test.log
$ echo ‘初期行3’ >> /tmp/follow_test.log
$ timeout 2s tail -f /tmp/follow_test.log &
初期行1
初期行2
初期行3
$ echo ‘追記行A’ >> /tmp/follow_test.log
追記行A
$ echo ‘追記行B’ >> /tmp/follow_test.log
追記行B
$ echo ‘追記行C’ >> /tmp/follow_test.log
追記行C
(2秒後に tail -f が自動終了)
tail -fでリアルタイム追尾の実測(ubuntu:24.04)
tail -fでリアルタイム追尾の実測(ubuntu:24.04)

追記行A・B・Cが即座に表示されることを実測で確認しました。VPSでNginxやNode.jsのログを監視するときも同じ動作です。

手順3:–retry オプション(ローテーション後のログに追随)

ログローテーションでファイルが切り替わる環境ではtail -f --retrytail -F(大文字のF)を使います。




ubuntu@linuxlab: ~
$ tail -F /var/log/nginx/access.log
# -F は –follow=name –retry と同等
# ログローテーション後も新しいファイルを自動追尾する

-f と -F の違い

  • tail -f:ファイルディスクリプタを追尾。ローテーション後は新ファイルを追わない
  • tail -F:ファイル名を追尾。ローテーション後も同じファイル名の新ファイルを自動追尾

複数ファイルを同時に表示する

headとtailは複数のファイルをまとめて確認する用途にも便利です。

手順1:複数ファイルの同時確認




ubuntu@linuxlab: ~
$ head -n 3 /tmp/file1.txt /tmp/file2.txt
==> /tmp/file1.txt <==
1
2
3
==> /tmp/file2.txt <==
6
7
8

複数ファイルを渡すと自動的に==> ファイル名 <==というヘッダーが入ります。

手順2:-q オプションでファイル名を隠す




ubuntu@linuxlab: ~
$ head -q -n 3 /tmp/file1.txt /tmp/file2.txt
1
2
3
6
7
8
複数ファイル表示と-qオプション(実測・ubuntu:24.04)
複数ファイル表示と-qオプション(実測・ubuntu:24.04)

-q(–quiet)でファイル名ヘッダーが消えます。逆に単一ファイルでも必ずヘッダーを表示させたい場合は-v(–verbose)を使います。ubuntu:24.04で実測確認済みです。

実践的な活用例

①ログの末尾をgrepと組み合わせる

パイプでgrepを組み合わせることで、ログのエラー行だけを素早く探せます。




ubuntu@linuxlab: ~
$ tail -n 100 /var/log/syslog | grep -i error
# 末尾100行から “error” を含む行だけ抽出

grepコマンドの詳細はを参照してください。

②CSVのヘッダーをスキップして本体を取り出す




ubuntu@linuxlab: ~
$ tail -n +2 data.csv > data_noheader.csv
# 2行目以降(ヘッダーを除くデータ本体)を別ファイルに保存

③headとtailを組み合わせて任意範囲を取り出す

15〜20行目だけが欲しい場合はheadで先頭20行を取り出し、さらにtailで末尾6行を絞り込みます。




ubuntu@linuxlab: ~
$ head -n 20 /tmp/test.txt | tail -n 6
15
16
17
18
19
20

sedコマンドを使った範囲指定についてはも参考になります。

④/etc/passwdでユーザー一覧を確認する

実際にubuntu:24.04のDockerコンテナで試すと、/etc/passwdの先頭5行は次のようになります。




ubuntu@linuxlab: ~
$ head -n 5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync

Ubuntu 22.04 vs 24.04:coreutils のバージョン差

Ubuntu 22.04から24.04にアップグレードした場合、coreutilsのバージョンが上がります。基本的な動作は変わりませんが、バージョンを確認しておきましょう。

Ubuntu 22.04 vs 24.04 coreutils比較(実測)
Ubuntu 22.04 vs 24.04 coreutils比較(実測)
項目 Ubuntu 22.04 LTS Ubuntu 24.04 LTS
コードネーム Jammy Jellyfish Noble Numbat
coreutils バージョン 8.32-4.1ubuntu1.3 9.4-3ubuntu6.2
head/tail バージョン GNU coreutils 8.32 GNU coreutils 9.4
tail -f / -F あり あり(動作改善)
サポート期限 2027年4月 2029年4月

バージョンはhead --versionで確認できます。Ubuntu 22.04では「GNU coreutils 8.32」、Ubuntu 24.04では「GNU coreutils 9.4」と表示されます(Dockerコンテナで実測)。

よくあるエラーと解決策

①「head: cannot open ‘…’ for reading: No such file or directory」




ubuntu@linuxlab: ~
$ head /tmp/nonexistent.txt
head: cannot open ‘/tmp/nonexistent.txt’ for reading: No such file or directory

ファイルが存在しないエラーです。ls /tmp/でファイル名を確認し、パスのスペルミスがないか確認してください。

②「tail: cannot open ‘…’ for reading: Permission denied」




ubuntu@linuxlab: ~
$ tail /var/log/auth.log
tail: cannot open ‘/var/log/auth.log’ for reading: Permission denied
$ sudo tail /var/log/auth.log
(rootのみ読める認証ログが表示される)

システムログ(/var/log/auth.log/var/log/syslogなど)は一般ユーザーには読めないことがあります。sudoを付けて実行してください。

③tail -f が反応しない

ファイルに追記が来るまで待機状態になるのは正常な動作です。別のターミナルから対象ファイルに書き込んでみてください。また、-n 0を付けると既存内容なしで追記だけを監視できます。




ubuntu@linuxlab: ~
$ tail -f -n 0 /var/log/nginx/access.log
# 既存の行を表示せず、これ以降の追記だけを監視する

まとめ

headtailコマンドは、Ubuntu上でのファイル確認作業に欠かせないツールです。Ubuntu 24.04(coreutils 9.4)で実測した結果をまとめます。

今回のまとめ

  • head / tailのデフォルトはどちらも10行(ubuntu:24.04で実測確認)
  • -n 数字で行数指定、-c 数字でバイト数指定
  • tailの-n +Nは「N行目以降」、headの-n -Nは「末尾N行を除く」という特殊構文
  • tail -fでリアルタイム追尾、tail -Fでログローテーション対応
  • 複数ファイルに-qでファイル名ヘッダーを非表示にできる
  • Ubuntu 22.04はcoreutils 8.32、24.04は9.4(実測)
著者アイコン
著者アイコン

正直、tail -fは「サーバー運用の合否を分けるコマンド」だと思っています。VPSを借りてNginxを動かしはじめた瞬間に必ず使うことになるので、早めに覚えておくと後が楽です。

本格的にVPSでサーバーを運用したい方は、VPS各社の速度・コスト比較記事も参考にしてください。

コメント

タイトルとURLをコピーしました