head / tail
| 対応: | 全Linux | |
|---|---|---|
| macOS(2001 Cheetah) | ||
| Bash 1.0(1989) |
『head』はファイルの先頭、『tail』は末尾の内容を表示するコマンドです。特に『tail -f』はログファイルの末尾をリアルタイムで監視する用途で頻繁に使われます。
構文
head [オプション] [ファイル...] tail [オプション] [ファイル...]
オプション一覧
| オプション | 概要 |
|---|---|
| head ファイル | ファイルの先頭10行を表示します。 |
| head -n N ファイル | 先頭N行を表示します。 |
| head -c N ファイル | 先頭Nバイトを表示します。 |
| head -n -N ファイル | 末尾N行を除いて全行を表示します。 |
| tail ファイル | ファイルの末尾10行を表示します。 |
| tail -n N ファイル | 末尾N行を表示します。 |
| tail -c N ファイル | 末尾Nバイトを表示します。 |
| tail -f ファイル | ファイルの末尾を監視し、追記されるたびにリアルタイムで表示します。 |
| tail -F ファイル | -f と同様ですが、ファイルが削除・再作成されても追跡し続けます。 |
| tail -n +N ファイル | N行目以降を表示します(先頭N-1行をスキップ)。 |
サンプルコード
以下のファイルを例に説明します。
~/project/data.csv
id,name,score 1,user1,85 2,user2,72 3,user3,91 4,user4,68 5,user5,95 6,user1,80 7,user2,88
ファイルの先頭3行を表示します。
head -n 3 data.csv id,name,score 1,user1,85 2,user2,72
ファイルの末尾3行を表示します。
tail -n 3 data.csv 5,user5,95 6,user1,80 7,user2,88
CSVのヘッダー(1行目)をスキップして2行目以降を取得します。
tail -n +2 data.csv 1,user1,85 2,user2,72 3,user3,91 4,user4,68 5,user5,95 6,user1,80 7,user2,88
『/etc/passwd』の先頭3行を確認します。
head -n 3 /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
ログファイルをリアルタイムで監視します(『Ctrl+C』で終了)。
tail -f /var/log/nginx/access.log
ローテーションされるログも追跡し続けます。
tail -F /var/log/app.log
パイプと組み合わせて、エラーログの最新10件だけを表示します。
grep "ERROR" app.log | tail -n 10
概要
『$ tail -f』はサーバーのログ監視でほぼ毎日使うコマンドです。複数ファイルを同時に監視したい場合は『$ tail -f ファイル1 ファイル2』のように複数指定できます。さらに強力なログ監視ツールとして『multitail』や『lnav』なども存在します。
よくあるミス
よくあるミス1: -n の行数指定を忘れてデフォルトの10行になる
行数を指定しないと head / tail は常に先頭・末尾の10行だけを表示します。多くの場合は意図通りですが、長いエラーメッセージが途中で切れることがあります。
tail app.log (最後の10行だけ表示。エラーが11行前に始まっていると見えない)
行数を明示的に指定します。
tail -n 50 app.log
よくあるミス2: tail -f でファイルローテーションに対応できない
tail -f は特定のファイルディスクリプタを追跡するため、logrotate でファイルが置き換わると追跡が止まります。
tail -f /var/log/app.log (ローテーション後、新しいログが表示されなくなる)
ファイル名で追跡し続ける -F を使います。
tail -F /var/log/app.log
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。