[Linux] tailコマンドの使い方

tailコマンドは入力された内容の末尾を表示します。デフォルトでは最後の10行を表示します。

tail – output the last part of files

tailマンドはGNU Coreutilsに含まれています。ここでは、tailコマンドの基本的な使い方を紹介します。
※以降の実行例は、Ubuntu17.10で確認しています。

1. 使い方

tail [option]... [file]...

fileが指定されていない場合は標準入力から読込みを行います。

option 説明
-c, --bytes=[+]N 最後のNバイトを表示します。’+‘を付けた場合、ファイルの先頭Nバイトから表示をします。
-f, --follow[={name|descriptor}] ファイルの末尾を無限に読み込み続けます。

-F --follow=name --retryと同じです。
-n, --lines=[+]N 最後のN行を表示します。’+‘を付けた場合、ファイルの先頭N行目から表示をします。
--max-unchanged-stats=N ファイルサイズがN回変化なかった場合、ファイルの再オープンを行います。デフォルトは5回です。このオプションは’--follow=name‘オプションの場合のみ有効です。
--pid=PID PIDのプロセスが終了したときに、tailを終了させます。
-q, --quiet, --silent ファイル名の表示を行いません。
--retry ログローテーションなどでファイルディスクリプタが変更された場合、ファイルの再オープンを行います。
-s, --sleep-interval=N 確認の間隔をN秒に変更します。デフォルトは1秒です。
-v, --verbose 出力の先頭に必ずファイル名を表示します。
-z, --zero-terminated 1行の区切りを改行ではなく’NUL’に変更します。
--help ヘルプを表示します。
--version バージョンを表示します。

2. 使用例

2.1. ファイルの末尾N行を表示する

tailコマンドにオプションを指定しない場合、入力の末尾10行を表示します。’-n, --lines‘オプションを利用することで、任意の末尾N行を表示することができます。

$ tail tailsample.txt    #デフォルト
line 6
line 7
line 8
line 9
line 10
line 11
line 12
line 13
line 14
line 15
$ tail -n 3 tailsample.txt    #末尾3行を表示
line 13
line 14
line 15

2.2. ファイルの出力を確認し続ける

ログファイルなど追記され続けるファイルの内容を監視したい場合、’-f‘オプションを利用することで無限にファイル末尾を確認します。

$ tail -f tailsample.txt
line 6
line 7
line 8
line 9
line 10
line 11
line 12
line 13
line 14
line 15

‘tail -f tailsample.txt’を実行していない別のターミナルからファイルに追記を行ってみます。

$ echo 'add line 16' >> tailsample.txt

‘tail -f tailsample.txt’を実行中のターミナルに’add line 16’が表示されます。

2.3. ファイル名を変更しても追随する

‘tail -f’のデフォルト動作はファイルディスクリプタでファイルを追跡します。このためファイル名を変更してもファイルディスクリプタは変更されないので、tailは追跡を続けることができます。

$ tail -f tailsample.txt
line 6
line 7
line 8
line 9
line 10
line 11
line 12
line 13
line 14
line 15

別のターミナルからファイル名の変更と追記を行います。

$ mv tailsample.txt tailsample.txt.mv
$ echo 'add line 16' >> tailsample.txt.mv

‘tail -f’を実行しているターミナルに’add line 16’が表示されます。このように’tail -f’の場合、ファイル名を変更してもtailは名前変更後のファイルを追随します。しかし、この動きはログローテーションなどでファイル名を変更している場合には都合が悪くなります。ファイルのローテーションで都合が悪くなる例を、次に紹介します。

2.4. ファイルを再作成してもtailで追随したい

tail -f‘のデフォルト動作では、対象のファイルがローテーションなどで再作成されると追随できなくなります。これは、’tail -f‘で認識しているファイルと新たに作成したファイルのファイルディスクリプタが異なるためです。tailはデフォルトでファイルディスクリプタを元に確認するファイルをチェックします。
確認のため、’tail -f‘で追随中のファイルを消して、同じ名前で再作成してみます。

$ rm tailsample.txt
$ echo 'new line 1' > tailsample.txt

同じ名前でファイルを再作成しても、tailを実行中のターミナルには何も変化はありません。
同じ名前のファイル名で再作成したときも自動的に追随したい場合は、’--follow=name --retry‘オプションを利用します。’--follow=name‘オプションで、ファイルの確認をファイルディスクリプタでなく、ファイル名で確認するようにします。’--retry‘オプションは、ファイルの追随方式が名前ベースでファイルを開けないときに再オープンをします。’--follow=name --retry‘オプションと’-F‘オプションは同意であるので、以下の例では’-F‘オプションを利用しています。

$ tail -F tailsample.txt
line 6
line 7
line 8
line 9
line 10
line 11
line 12
line 13
line 14
line 15

先程の例と同じように、別のターミナルからファイルを削除し、同じ名前で再作成をしてみます。

$ rm tailsample.txt

ファイルを削除すると、tailを実行しているターミナルには以下のメッセージが表示されました。

tail: 'tailsample.txt' はアクセス不能になりました: そのようなファイルやディレクトリはありません

同じファイル名で再作成をしてみます。

$ echo 'new line 1' > tailsample.txt

同じファイル名で再作成を行うと、tailを実行しているターミナルに以下のメッセージが表示されました。

tail: 'tailsample.txt' has appeared;  following new file
new line 1

同じ名前で再作成したファイルをtailが自動的に認識しました。このようにファイルを名前変更して再作成をしている場合は、’-F‘オプションを利用します。
 
以上、tailコマンドの使い方の紹介でした。