tail — 顯示檔案的結尾部分

顯示檔案的後幾行,-f 可即時監控日誌更新。

語法

tail [選項] [檔案...]

常用選項

選項 說明 範例
-n NUM, --lines=NUM 顯示最後 NUM 行(預設 10) tail -n 50 file.txt
-c NUM, --bytes=NUM 顯示最後 NUM 個位元組 tail -c 500 file.bin
-f, --follow 即時追蹤檔案新增的內容(持續輸出) tail -f /var/log/syslog
-F 同 -f,但在檔案被輪替(rotate)後繼續追蹤 tail -F /var/log/nginx/access.log
-n +NUM 從第 NUM 行開始顯示到結尾 tail -n +5 file.txt
-s SEC 搭配 -f,指定輪詢間隔秒數(預設 1 秒) tail -f -s 0.5 log.txt
--pid=PID 搭配 -f,當指定 PID 的程序結束時停止 tail -f --pid=1234 log.txt

使用範例

範例 1:查看最後 10 行

最基本的用法,查看日誌檔案最近的 10 行記錄。

$ tail /var/log/auth.log
May 20 10:01:23 host sshd[5678]: Accepted publickey for user from 192.168.1.5
May 20 10:05:11 host sshd[5679]: pam_unix(sshd:session): session opened for user user
範例 2:即時監控日誌(最常用!)

使用 -f 持續顯示日誌的新增行,按 Ctrl+C 停止。適合除錯時即時查看服務狀態。

$ tail -f /var/log/nginx/access.log
(持續顯示新進的存取記錄,按 Ctrl+C 離開)
tail -f 是監控日誌的標準做法,systemd 服務也可用 journalctl -f 達到同樣效果。
範例 3:同時監控多個日誌

可同時監控多個日誌檔案,tail 會在每段前顯示檔案名稱以區分。

$ tail -f /var/log/syslog /var/log/auth.log
==> /var/log/syslog <==
May 20 10:12:00 host kernel: ...

==> /var/log/auth.log <==
May 20 10:12:01 host sshd: ...
範例 4:搭配 grep 過濾日誌

使用管線搭配 grep,只顯示包含「ERROR」的最新日誌行。

$ tail -f /var/log/app.log | grep --line-buffered "ERROR"
(即時過濾並顯示含 ERROR 的行)
注意加上 --line-buffered 讓 grep 在管線模式中即時輸出,不做緩衝。
範例 5:從指定行開始顯示

使用 +NUM 從第 5 行開始顯示到結尾(跳過前 4 行,常用於跳過 CSV 標頭)。

$ tail -n +5 data.csv
(從第 5 行開始到結尾的所有內容)

常見錯誤與排錯

tail: cannot open 'filename' for reading: No such file or directory
原因
指定的檔案不存在。
解法
確認路徑正確。若是即時追蹤尚未建立的日誌,可等待服務啟動後再執行。
tail -f 追蹤日誌被輪替後停止更新
原因
logrotate 等工具輪替日誌時,原本的 inode 被刪除,-f 無法繼續追蹤新檔。
解法
改用 -F(大寫)代替 -f,-F 會偵測檔案名稱並在輪替後自動重新開啟。

延伸閱讀