输出文件最后的部分
命令语法格式
tail [OPTION]… [FILE]…
默认打印每个文件FILE中的最后10行到标准输出中。如果给出了多个文件,会在输出的最开始标记出文件名。
如果没有指定FILE或者FILE为-时,tail会从标准输入中读入内容。
命令选项
需要提供给长选项的参数也必须提供给对应的短选项。
-c, –bytes=[+]NUM
输出最后的NUM字节。或者使用-c +NUM从文件中的第NUM字节开始输出。NUM后面可以使用单位:b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024, 以及 T, P, E, Z, Y等。
-f, –follow [={name|descriptor}]
对于正在增长的文件,该选项会不停地读取文件中的内容。如果指定了多个文件,则在输出的内容开始添加当前文件的描述头,以指示输出内容的来源。
name和descriptor,二者的区别只有在删除或重命名了被跟踪文件时才能表现出来:
- 如果想不断的追踪文件,即使它已被取消链接,请使用–follow=descriptor。这是默认的。
- 如果你正在跟踪可能会轮转(删除或重命名,然后重新打开)的日志文件,则descriptor不会有用,因为descriptor跟踪的是原文件。在这种情况下,请使用–follow=name来进行命名文件跟踪,或者是定期重新打开它,以查看是否已被其他程序删除并重新创建。请注意,基于inotify的实现可以处理这种情况,而无需定期重新打开。
无论使用哪种方法,如果文件被截断或者内容缩小了,tail会打印一条提示提示文件被截断了,然后从新的结束点继续追踪文件。
当文件被删除时,tail的行为取决于于使用了name还是descriptor:
- 当使用name时,tail可以检测到文件已被删除并给出了一个消息,并且如果指定了–retry,它将继续定期检查以查看文件是否重新出现。
- 当使用descriptor时,tail不会检测到该文件已被取消链接或重命名,并且没有任何提示;即使该文件可能无法通过其原始名称访问,它可能仍在增长。
对于name和descriptor,可能只有长选项–follow才支持。
如果没有指定操作数FILE,或者标准输入是FIFO、管道,则忽略-f选项。同样,当标准输入是FIFO、管道时,-f选项对指定为’-‘的任何操作数都不起作用。
使用内核支持inotify,输出是由文件更改进行触发的,通常速度非常快。否则,tail会在检查文件之间睡眠一秒钟,这可以使输出显示出较少的响应。可以使用–sleep-interval=n来更改默认值。如果不支持nootify时,可以通过使用小数秒来减小时间间隔来,以使其更加灵敏:
-F
等价于–follow=name –retry。在文件被移除后,不断的尝试重新打开文件,知道文件再次可以访问。
-n, –lines=[+]NUM
输出最后的NUM行。如果使用了-n +NUM,则表示从第NUM行开始输出。
–max-unchanged-stats=N
当通过name处理文件时,如果在N次(默认为5)连续的循环中文件内容都没有更改,则使用open/fstat以确定该文件名是否仍然关联到相同的设备号或节点号。当跟踪轮转日志文件时,大约的N值应该在tail打印最后一个预轮转行以及tail打印在新日志文件中累积的线的秒数之间。
此选项仅在轮询时(没有inotify)并且按name跟踪时才有意义。
–pid=PID
当通过name和descriptor进行跟踪时,可以指定所有FILE参数的唯一写入者的进程ID、pid。tail会与指定进程一起退出。只有写入程序与tail运行在同一台机器上时该选项才是有效的。
例如,要将构建日志写入文件,并观察文件增长,可以使用先面的命令:
在make执行结束后,tail也会退出,否则的话,你只能手动退出tail。如果你指定了一个未使用的pid,或与提供的PID与给tail进行追踪的文件不匹配,则在任何文件停止增长之前,尾部可能会终止很久,或者在真正的写入者终止后很久才会退出。请注意,某些系统不支持–pid。如果是这种情况,tail会打印警告。
–retry
如果无法访问文件,继续尝试打开文件,直到文件出现。在以下情况中会用到该选项:
- 当使用文件描述符时(即使用–follow=descriptor),该选项仅影响初始时的文件打开,因为在打开成功后,tail会使用这个文件描述符。
- 当使用文件名时(即使用–follow=name),tail将不停的进行重试,以重新打开给定文件,直至tail被结束。
如果没有这个选项,当tail遇到一个不存在或者不可访问的文件时,它会报告这个问题并且不会再检查。
-s, –sleep-interval=N
每个循环之间等待的秒数(默认值为1.0)。在一次循环中,tail检查每个指定的文件以查看其大小是否改变了。在tail的历史实现中要求N是一个整数。但是,GNU tail接受任意的浮点数。请参阅浮点。
当tail使用inotify时,通常会忽略此轮询相关选项。但是,如果你还指定–pid=p,则tail会检查进程p是否至少在每个N秒内都处于活动状态。
与-f一起,间隔N秒执行一次抓取内容。
与支持inotify并且和–pid=P,没间隔N秒检查一次。
-v, –verbose
在输出内容的开始处打印文件名。与-q选项相反。
-q, –quiet, –silent
不在输出内容的开始处打印文件名。与-v选项相反。
-z, –zero-terminated
默认以换行符号(LF)为分隔符。-z表示使用NUL做为分隔符。即,将输入项视为由ASCII NUL分隔,并用ASCII NUL终止输出各个项。
这个选项可以和’perl -0’或者’find -print0’和’xargs -0’结合使用,它们可以可靠地处理任意文件名(甚至文件名中包含空格或其他特殊字符都可以很好的处理)。
–help
显示帮助信息并退出。
–version
显示版本信息并退出。
注意事项
还有一些旧的废弃的命令行语法,已经不再推荐使用了,可以参照官方的文档(位于在线手册页的底部);
参考文献
- man 1 tail, version GNU coreutils 8.26
- 在线手册页面:http://www.gnu.org/software/coreutils/tail
- How to grep a string after a specified line number?
更新日志
- 05/27/2017 创建文章