こちらからSWELLを購入できます 詳しくはこちら

【Linux】tailコマンド完全ガイド ログ監視と末尾表示の基本

  • URLをコピーしました!

今回はLinuxコマンドであるtailコマンドについて解説します

ファイルの末尾(最後の数行)を表示するコマンドです
ログの確認やtail -fでのリアルタイム監視など、障害対応で真っ先に使うのでぜひ覚えて帰ってくださいね!
※注 本文の△は半角スペースに置き換えてください。わかりやすくするために△で記述してます

スポンサーリンク
目次

tailコマンドとは??

tailコマンドは、ファイルの末尾(最後の数行)を表示するコマンドです
名前のとおり「しっぽ(tail)」を見るイメージです
ログファイルは新しい情報が下に追記されていくので、「直近で何が起きたか」を知りたいときは末尾だけ見れば十分なことがほとんどです
ファイル全体を表示するcatだと、大きなログでは画面が流れてしまって目的の行が見つかりません
この記事の実行結果は、GNU coreutils 9.4(Ubuntu 24.04)のtailで確認しています

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

tailコマンドには便利なオプションがあります

オプション意味
-n (–lines)末尾から指定した行数を表示するオプション(省略時は10行)
-n +行番号行数の前に+を付けると、「その行番号から最後まで」を表示
-c (–bytes)行ではなくバイト数で末尾を切り出すオプション
-f (–follow)ファイルへの追記をリアルタイムで表示し続けるオプション
-F-fに加えて、ファイルが作り直されても追いかけ直すオプション
-q複数ファイルを指定したときの見出しを制御するオプション
「-v」と違い、見出しを表示しない
-v複数ファイルを指定したときの見出しを制御するオプション
「-v」と違い、ファイルが一つでも見出しを表示する

ここからは、テスト用ディレクトリtail-testの中に作った練習用ファイルを使って説明します
sample.txtはline1〜line15の15行、app.logはアプリのログを想定したファイルです
次のコマンドで同じファイルを作れるので、一緒に試してみてください

事前準備
mkdir△tail-test
cd△tail-test
seq△-f△”line%g”△1△15△>△sample.txt
printf△”a\nb\nc\n”△>△a.txt
printf△”x\ny\n”△>△b.txt
printf△”2026-10-27△10:00:01△INFO△start\n2026-10-27△10:00:02△INFO△connect△db\n2026-10-27△10:00:03△INFO△listening△on△port△8080\n”△>△app.log
echo△old1△>△r.log
ls△-l
実行結果:
total 20
-rw-rw-r– 1 user user 6 Nov 1 12:00 a.txt
-rw-rw-r– 1 user user 115 Nov 1 12:00 app.log
-rw-rw-r– 1 user user 4 Nov 1 12:00 b.txt
-rw-rw-r– 1 user user 5 Nov 1 12:00 r.log
-rw-rw-r– 1 user user 96 Nov 1 12:00 sample.txt
cat△sample.txt
実行結果:
line1
line2
line3
line4
line5
line6
line7
line8
line9
line10
line11
line12
line13
line14
line15
cat△a.txt
実行結果:
a
b
c
cat△b.txt
実行結果:
x
y
cat△app.log
実行結果:
2026-10-27 10:00:01 INFO start
2026-10-27 10:00:02 INFO connect db
2026-10-27 10:00:03 INFO listening on port 8080
cat△r.log
実行結果:
old1

以降のコマンドは、すべてtail-testの中で記事の順番どおりに実行した結果です
app.logは途中で追記していくので、節が進むと行が増えていきます

-n (–lines)

末尾から指定した行数を表示するオプション(省略時は10行)
tail -3 sample.txtのように-nを省略した古い書き方もあり、現場の手順書などでよく見かけます

コマンド実行例
tail△-n△3△sample.txt
実行結果:
line13
line14
line15
tail△-3△sample.txt
実行結果:
line13
line14
line15
# -nを省略した古い書き方でも同じ結果になります

-n +行番号

行数の前に+を付けると、「その行番号から最後まで」を表示します
tail -n +2 data.csvで「CSVの1行目(ヘッダー行)を飛ばして表示する」といった使い方ができます

コマンド実行例
tail△-n△+13△sample.txt
実行結果:
line13
line14
line15

-n 13(最後の13行)と-n +13(13行目以降)は結果がまったく違うので、混同しないよう注意しましょう

-c (–bytes)

行ではなくバイト数で末尾を切り出すオプション
改行文字も1バイトとして数えます

コマンド実行例
tail△-c△12△sample.txt
実行結果:
ne14
line15
# 「ne14+改行+line15+改行」の12バイトが表示されています

日本語などのマルチバイト文字は途中で切れて文字化けすることがあるので、普段は-nを使うのがおすすめです

-f (–follow)

ファイルへの追記をリアルタイムで表示し続けるオプション
末尾を表示したあとも終了せずに待ち続け、追記された行をその場で表示してくれます

コマンド実行例
tail△-f△app.log
# tail -fを動かしたまま、別のターミナルで次を実行して追記する
echo△”2026-10-27△10:00:05△ERROR△db△timeout”△>>△app.log
echo△”2026-10-27△10:00:06△INFO△retry”△>>△app.log
実行結果:
2026-10-27 10:00:01 INFO start
2026-10-27 10:00:02 INFO connect db
2026-10-27 10:00:03 INFO listening on port 8080
2026-10-27 10:00:05 ERROR db timeout
2026-10-27 10:00:06 INFO retry
# 1〜3行目はもともとあった内容、4〜5行目は別のターミナルで追記した行です
# 監視をやめるときはCtrl+Cを押します

-F

-fに加えて、ファイルが作り直されても追いかけ直すオプション(–follow=name –retryと同じ)
ログローテーション対策に使います(詳しくは後ほど解説します)

コマンド実行例
tail△-F△app.log
# tail -Fを動かしたまま、別のターミナルで次を実行して追記する
echo△”2026-10-27△10:00:07△INFO△retry△ok”△>>△app.log
実行結果:
2026-10-27 10:00:01 INFO start
2026-10-27 10:00:02 INFO connect db
2026-10-27 10:00:03 INFO listening on port 8080
2026-10-27 10:00:05 ERROR db timeout
2026-10-27 10:00:06 INFO retry
2026-10-27 10:00:07 INFO retry ok
# ファイルが作り直されない場合の表示は-fと同じです
# 監視をやめるときはCtrl+Cを押します

-q / -v

複数ファイルを指定したときの見出しを制御するオプション
-qは見出しを表示しない、-vはファイルが1つでも見出しを表示します

コマンド実行例
tail△-n△2△a.txt△b.txt
実行結果:
==> a.txt <==
b
c

==> b.txt <==
x
y
tail△-q△-n△1△a.txt△b.txt
実行結果:
c
y

基本的な使い方

tailコマンドの基本的な構文は「tail△オプション△ファイル名」となります
オプションを付けずに実行すると、最後の10行が表示されます

コマンド実行例
tail△sample.txt
実行結果:
line6
line7
line8
line9
line10
line11
line12
line13
line14
line15
tail△-n△50△app.log
実行結果:
2026-10-27 10:00:01 INFO start
2026-10-27 10:00:02 INFO connect db
2026-10-27 10:00:03 INFO listening on port 8080
2026-10-27 10:00:05 ERROR db timeout
2026-10-27 10:00:06 INFO retry
2026-10-27 10:00:07 INFO retry ok
# 最後の50行を表示します(app.logは6行しかないので全行が表示されます)
tail△-f△app.log
実行結果:
2026-10-27 10:00:01 INFO start
2026-10-27 10:00:02 INFO connect db
2026-10-27 10:00:03 INFO listening on port 8080
2026-10-27 10:00:05 ERROR db timeout
2026-10-27 10:00:06 INFO retry
2026-10-27 10:00:07 INFO retry ok
# 末尾を表示したあとも終了せずに待ち続け、追記があればその行が続けて表示されます(Ctrl+Cで終了)

ログをリアルタイムで監視する

tailの一番の見どころが-fを使ったリアルタイム監視です
アプリの再起動や設定変更の直後に、別のターミナルでtail -fを開いておくと、エラーが出たかどうかをすぐに確認できます

リアルタイム監視の例
# 今から追記される行だけ見る
tail△-n△0△-f△app.log
# 別のターミナルで次を実行して追記する
echo△”2026-10-27△10:01:00△INFO△user△login”△>>△app.log
実行結果:
2026-10-27 10:01:00 INFO user login
# 既存の行は表示されず、追記した行だけが表示されます

# 直近50行を表示してから監視を始める
tail△-n△50△-f△app.log
# 別のターミナルで次を実行して追記する
echo△”2026-10-27△10:01:30△INFO△user△logout”△>>△app.log
実行結果:
2026-10-27 10:00:01 INFO start
2026-10-27 10:00:02 INFO connect db
2026-10-27 10:00:03 INFO listening on port 8080
2026-10-27 10:00:05 ERROR db timeout
2026-10-27 10:00:06 INFO retry
2026-10-27 10:00:07 INFO retry ok
2026-10-27 10:01:00 INFO user login
2026-10-27 10:01:30 INFO user logout
# 最後の行が監視中に追記した行です

# grepと組み合わせてエラーだけ監視する
tail△-f△app.log△|△grep△–line-buffered△ERROR
# 別のターミナルで次を実行して追記する
echo△”2026-10-27△10:02:00△INFO△request△ok”△>>△app.log
echo△”2026-10-27△10:02:01△ERROR△boom”△>>△app.log
実行結果:
2026-10-27 10:00:05 ERROR db timeout
2026-10-27 10:02:01 ERROR boom
# 1行目は最初に表示される末尾10行に含まれていたERROR行、2行目は監視中に追記したERROR行です
# INFOの行は表示されず、ERRORを含む行だけが流れてきます

ポイントは–line-bufferedです
grepは出力先が画面ではなくパイプやファイルのとき、出力をある程度ためてからまとめて書き出します
そのため後ろにさらにコマンドをつなぐと、なかなか結果が出てこないことがあります
–line-bufferedを付けておけば1行ごとに出力されるので、リアルタイム監視では付けておくクセをつけると安心です

-fと-Fの違い(ログローテーション対策)

多くのサーバーでは、ログが大きくなりすぎないようにログローテーション(古いログをapp.log.1などにリネームして、新しいapp.logを作り直す仕組み)が動いています
このとき、-fは最初に開いた「ファイルそのもの」を追いかけるので、リネーム後のapp.log.1を見続けてしまい、新しいapp.logに書かれた行は表示されません
-Fは「ファイル名」を追いかけるので、ファイルが作り直されたら新しいファイルを開き直して表示を続けます

監視中にファイルを作り直した場合
# -fの場合
tail△-f△r.log
# 別のターミナルで次を実行して、ローテーションと同じようにファイルを作り直す
mv△r.log△r.log.1
echo△new1△>△r.log
echo△new2△>>△r.log
実行結果:
old1
# 作り直した後に書いたnew1、new2が表示されません

# 事前準備:r.logを元の状態に戻す
rm△r.log.1
echo△old1△>△r.log
cat△r.log
実行結果:
old1

# -Fの場合
tail△-F△r.log
# 別のターミナルで次を実行して、ファイルを作り直す
mv△r.log△r.log.1
echo△new1△>△r.log
echo△new2△>>△r.log
実行結果:
old1
tail: ‘r.log’ has become inaccessible: No such file or directory
tail: ‘r.log’ has appeared; following new file
new1
new2
# 表示されるメッセージは、ファイルの入れ替わり方や環境によって多少変わります

長時間ログを監視するときや、ローテーションが走る時間帯をまたいで監視するときは、-Fを使うのがおすすめです
「tail -fしていたのに、いつの間にかログが流れなくなった」というのは、このローテーションが原因であることが多いです

tailコマンドの実用的な活用例

実際の現場でよく使われるtailコマンドの活用例をご紹介します

活用例
# Webサーバーのアクセスログとエラーログをまとめて監視する
sudo△tail△-f△/var/log/nginx/access.log△/var/log/nginx/error.log
# ログのパスはディストリビューションや設定によって異なります

# headと組み合わせて6〜8行目を取り出す
head△-n△8△sample.txt△|△tail△-n△3
実行結果:
line6
line7
line8

# 直近1000行の中からエラーを探す
tail△-n△1000△app.log△|△grep△ERROR
実行結果:
2026-10-27 10:00:05 ERROR db timeout
2026-10-27 10:02:01 ERROR boom

# ディレクトリ内で一番古いファイルを確認する
ls△-lt△/var/log△|△tail△-n△3

/var/log配下のログは一般ユーザーでは読めないことが多いので、権限エラーが出る場合はsudoを付けて実行してください

トラブルシューティング

tailコマンド使用時によくある問題と解決法です

同じファイルにリダイレクトするとファイルが空になる

「ログが大きくなったから、最後の1000行だけ残したい」と思って、同じファイルにリダイレクトするのは絶対にNGです
※シェルは>を見た時点で、tailが読む前にファイルを空にしてしまいます

NG例と正しいやり方
# NG:中身がすべて消える
seq△1△5△>△w.txt
tail△-n△2△w.txt△>△w.txt
wc△-c△w.txt
実行結果:
0 w.txt

# OK:別のファイルに出力してから置き換える
seq△1△5△>△w.txt
tail△-n△2△w.txt△>△w_tail.txt△&&△mv△w_tail.txt△w.txt
cat△w.txt
実行結果:
4
5

本番のログで実行すると復旧できないので注意してください
なお、アプリケーションが書き込み中のログファイルをmvで置き換えると、アプリ側は古いファイルに書き続けてしまうことがあります
動いているサービスのログを整理したいときは、logrotateなどの仕組みに任せるのが安全です

tail -fは終了しない

-fや-Fは自分で止めるまで動き続けます
シェルスクリプトの中で使うと処理がそこで止まったままになるので、スクリプトで末尾を確認したいだけなら-fは付けないようにしましょう

まとめ

いかがでしたでしょうか
今回はtailコマンドについてまとめてみました
tailはファイルの末尾を表示するコマンドで、-n 行数で行数を指定、-n +行番号でその行以降を表示できます
-fでリアルタイム監視、ローテーション対策には-F、grepと組み合わせるときは–line-bufferedを付けましょう
障害対応のスピードがぐっと上がるので、ぜひマスターしてください!

スポンサーリンク

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!