tail 命令用于显示文件的末尾内容,默认显示文件的最后 10 行。通常情况下,tail 命令用于实时查看日志文件,可以使用 -f 参数跟踪文件内容的变化。tail 命令的语法如下:
tail [选项...] [文件名...]
tail 命令支持以下参数:
该选项用于指定要显示的行数,K 为整数。例如,-n 20 表示显示文件的最后 20 行。如果 K 前面加上一个正号 + ,则表示从文件开头数第 K 行开始显示。例如,-n +10 表示显示文件的第 10 行及其之后的所有内容。如果 K 前面加上一个负号 - ,则表示显示文件的除了最后 K 行以外的所有内容。例如,-n -20 表示显示文件除了最后 20 行以外的所有内容。
示例:
tail -n 20 access.log
该命令将会显示 access.log 文件的最后 20 行。
tail -n +10 access.log
该命令将会从 access.log 文件的第 10 行开始显示所有内容。
该选项用于实时查看文件的内容,并持续输出最新的内容。当文件内容增加时,tail 命令会自动更新显示的内容。如果不加参数,则默认使用文件名作为标识符,也可以使用文件描述符、管道等作为标识符。
示例:
tail -f access.log
该命令将会实时查看 access.log 文件的内容,并持续输出最新的内容。
该选项用于禁止显示文件名和文件头标识符。在多文件查看时,该选项可以避免显示每个文件的文件名。
示例:
tail -q -n 10 access.log error.log
该命令将会显示 access.log 和 error.log 文件的最后 10 行,但不会显示文件名和文件头标识符。
该选项和 -q 相反,用于显示文件名和文件头标识符。
示例:
tail -v -n 10 access.log error.log
该命令将会显示 access.log 和 error.log 文件的最后 10 行,并显示文件名和文件头标识符。
该选项用于指定要显示的字节数,K 为整数。例如,-c 1024 表示显示文件的最后 1024 个字节。如果 K 前面加上一个正号 + ,则表示从文件开头数第 K 个字节开始显示。例如,-c +1024 表示显示文件从第 1024 个字节开始的所有内容。如果 K 前面加上一个负号 - ,则表示显示文件的除了最后 K 个字节以外的所有内容。例如,-c -1024 表示显示文件除了最后 1024 个字节以外的所有内容。
示例:
tail -c 1024 access.log
该命令将会显示 access.log 文件的最后 1024 个字节。
该选项用于指定当文件被删减或重命名等情况下,等待最长的时间,单位为秒。如果在指定的时间内文件没有恢复,tail 命令就退出。默认值为 5 秒。
示例:
tail --max-unchanged-stats=10 -f access.log
该命令将会实时查看 access.log 文件的内容,并等待最长 10 秒的时间。
该选项用于指定进程 ID。如果指定了该选项,则 tail 命令会在该进程退出时也退出。该选项可以避免因为进程退出而产生的错误信息。
示例:
tail -f access.log --pid=1234
该命令将会实时查看 access.log 文件的内容,并在进程 ID 为 1234 的进程退出时退出。
该选项用于重新打开被删除或重命名的文件。如果文件重新出现,tail 命令就会读取新的文件内容。
示例:
tail -f access.log --retry
该命令将会实时查看 access.log 文件的内容,并重新打开文件。
tail 命令可以显示多个文件的末尾内容,将文件名依次写在命令行的末尾即可。如果要在多个文件中搜索指定的内容,可以使用 cat 命令和管道符号将多个文件合并成一个标准输出流,再使用 tail 命令查找指定的内容。
示例:
tail -f access.log error.log
该命令将会实时查看 access.log 和 error.log 文件的内容。
cat access.log error.log | tail -n 20 | grep "error"
该命令将会从 access.log 和 error.log 文件中的最后 20 行中查找包含 “error” 的内容。
在实际生产环境中,日志经常需要定期进行滚动,以免文件过大导致读写效率低下。tail 命令可以和 crontab 结合使用,定期检查日志文件的大小,达到一定阈值时进行备份并创建新的日志文件。
示例:
0 0 * * * if [ -f access.log ]; then if [ $(stat -c%s "access.log") -gt 1000000 ]; then mv access.log $(date +"%Y%m%d%H%M%S").access.log && touch access.log; fi; fi;
该命令将会在每天零点检查 access.log 文件的大小,如果超过 1000000 字节,则将文件重命名为格式为 “年月日时分秒.access.log” 的名字,并创建一个新的 access.log 文件。这样可以保证每天都有一个新的日志文件,并且每个日志文件的大小不会超过阈值。