tail コマンド 2016/11/15
テキストファイルまたはパイプでのテキスト入力の最後のn行を抜き出すコマンド。行単位ではなくバイト単位での指定も可能。デフォルトでは最後の10行を抜き出す。
ログファイルにログが追記されていく様子をリアルタイムに見るためにも使う。
行数は -n オプションで、バイト単位であれば -c オプションで指定する。
最後の10行を表示
$ tail -n10 hoge.txt
-n と 10 は分けて書いてもよい。
$ 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
関連
headコマンド: 最後ではなく先頭のn行を抜き出すコマンド
インストール 2016/03/17
Coreutilsというパッケージに入っているので、CentOSにもUbuntuにも始めから入っている。
n行目以降を出力するには 2015/08/19
最後のn行ではなく、先頭の n-1 行を削ったn行目以降を出力するには + を付ける。
## 最初の9行を除いて10行目からを表示
$ tail -n +10 hoge.txt
行単位ではなくバイト単位も同様。
## 最初の9バイトを除いて10バイト目からを表示
$ tail -c +10 hoge.txt
n行目だけを出力するには 2015/08/26
headコマンドで最初のn行を抜き出して、
tailコマンドでそのうちの最後の行だけを抜け出せばよい。
10行目だけを出力する例
$ cat hoge.txt | head -n10 | tail -n1
まあ、2つのコマンドを組み合わせなくてもsedコマンドを使ったほうが簡単かも。
10行目だけを出力する例
$ cat hoge.txt | sed -n 10p
行を逆順にするには 2015/08/20
MacなどのBSDの環境では、-r オプションを使うと、行を逆順にして出力、つまり最後の行を最初に出力して、1行目を最後に出力させることができる。
$ tail -r hoge.txt
2回逆順にすれば当然元に戻る。意味ないが。
$ tail -r hoge.txt | tail -r
CentOSやUbuntuでは、-r オプションを使えないが代わりにtacコマンドを使えばよい。
ログファイルなどの追記出力をリアルタイムに画面に表示するには 2017/03/26
以下のように -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 と同じことができる。
関連
複数のログファイルを同時に監視するには 2016/03/08
-f は複数のファイルを同時に監視することもできる。
$ tail -f access_log error_log
複数ファイルの場合は、ファイルにログが書き出されるごとにそのファイル名を
`==> access_log <==`
のように表示してからログが表示される。
multitail というコマンドや xtail というコマンドもあるらしい。
特定のプロセスが終了したときに自動で tail -f も終了させるには
2015/07/25
--pid オプションでプロセスIDを指定すると、そのプロセスが終了したときにtailも終了してくれる。
以下のコードを実行すると tail -f は3秒で終了する。
sleep 3 &
pid=$!
tail -f --pid $! log.txt
--pid=$! と = を付けて書いてもよい。