tail コマンド

テキストファイルまたはパイプでのテキスト入力の最後のn行を抜き出すコマンド。行単位ではなくバイト単位での指定も可能。デフォルトでは最後の10行を抜き出す。

ログファイルにログが追記されていく様子をリアルタイムに見るためにも使う。

行数は -n オプションで、バイト単位であれば -c オプションで指定する。

最後の10行を表示

$ tail -n10 hoge.txt

-n10 は分けて書いてもよい。

$ tail -n 10 hoge.txt

n は省略でき、ハイフンと数字だけでよい。

$ tail -10 hoge.txt

最後の10行というのは tail のデフォルト動作なので、オプション全部省略。

$ tail hoge.txt

パイプを使う例

cat hoge.txt | tail

最後の10バイトを表示 (行数ではなくバイト数で指定)

tail -c10 hoge.txt

複数のファイルを指定した場合は、ファイル名とともに表示する。

$ tail foo.txt bar.txt
==> foo.txt <==
...
==> bar.txt <==
...

ログファイルのリアルタイム監視

$ tail -f foo.log

関連

インストール

Coreutilsというパッケージに入っているので、CentOSにもUbuntuにも始めから入っている。

n行目以降を出力するには

最後のn行ではなく、先頭の n-1 行を削ったn行目以降を出力するには + を付ける。

## 最初の9行を除いて10行目からを表示
$ tail -n +10 hoge.txt

行単位ではなくバイト単位も同様。

## 最初の9バイトを除いて10バイト目からを表示
$ tail -c +10 hoge.txt

n行目だけを出力するには

headコマンドで最初のn行を抜き出して、 tailコマンドでそのうちの最後の行だけを抜け出せばよい。

10行目だけを出力する例

$ cat hoge.txt | head -n10 | tail -n1

まあ、2つのコマンドを組み合わせなくてもsedコマンドを使ったほうが簡単かも。

10行目だけを出力する例

$ cat hoge.txt | sed -n 10p

行を逆順にするには

MacなどのBSDの環境では、-r オプションを使うと、行を逆順にして出力、つまり最後の行を最初に出力して、1行目を最後に出力させることができる。

$ tail -r hoge.txt

2回逆順にすれば当然元に戻る。意味ないが。

$ tail -r hoge.txt | tail -r

CentOSやUbuntuでは、-r オプションを使えないが代わりにtacコマンドを使えばよい。

ログファイルなどの追記出力をリアルタイムに画面に表示するには

以下のように -f を付けると、ログをリアルタイムに監視できる。このコマンドを起動すると、ファイルの最後の部分を表示した後、ファイルの追記を監視して、追記されたらその部分を表示して監視を継続してくれる。監視を終了するには Ctrl+C を押すなどする。

$ tail -f access_log

tailfコマンドでも同じ。

$ tailf access_log

ログファイルをgrepなどでパイプ処理して tail -f で監視する場合に、

$ tail -f access_log | grep 404

のようにすると、grepが出力をバッファリングしてしまい、リアルタイムな監視ができない。いくらかの出力がたまにまとめて一度に表示されるようになってしまう。そんな場合はバッファリングしないようにする必要があるが、その方法はコマンドによって異なる。

grep の場合は --line-buffered というオプションを付ければ行単位で出力してくれるので、ログの監視には問題ない。

tail -f access_log | grep --line-buffered 404

lessコマンドでも +F というオプションで tail -f と同じことができる。

関連

複数のログファイルを同時に監視するには

-f は複数のファイルを同時に監視することもできる。

$ tail -f access_log error_log

複数ファイルの場合は、ファイルにログが書き出されるごとにそのファイル名を

`==> access_log <==`

のように表示してからログが表示される。

multitail というコマンドや xtail というコマンドもあるらしい。

特定のプロセスが終了したときに自動で tail -f も終了させるには

--pid オプションでプロセスIDを指定すると、そのプロセスが終了したときにtailも終了してくれる。

以下のコードを実行すると tail -f は3秒で終了する。

sleep 3 &
pid=$!
tail -f --pid $! log.txt

--pid=$!= を付けて書いてもよい。

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク