翻译整理自文章Stop using tail -f (mostly)和来自此文章评论。

我仍然看到很多人使用tail -f来监视正在更改的文件,主要是日志文件。如果您是其中之一,请允许我向您展示一个更好的选择:less +F

Less +F

less的文档很好地说明了+F参数的内容

Scroll forward, and keep trying to read when the end of file is reached. Normally this command would be used when already at the end of the file. It is a way to monitor the tail of a file which is growing while it is being viewed. (The behavior is similar to the “tail -f” command.)

向前滚动,并在到达文件末尾时尝试继续读取。通常在文件末尾使用此命令。这是一种监视正在更改的文件尾部的方法。(该行为类似于tail -f命令。)

看起来它与tail -f非常相似, 但是为什么我认为它更好呢?

简而言之,它允许您在导航和观看模式之间切换。 我们都有过这样的经历:

正在用tail -f查看文件,然后需要在此文件中搜索某些内容,或者只是上下翻看。 现在,您需要退出tail(或打开新的shell),并用ack处理文件或使用vim打开它以查找所需内容。 之后,您再次运行tail以继续查看文件。 而使用less时无需这样做。

假设查看文件production.log

$ less +F production.log

Important
log
information
here

Waiting for data... (interrupt to abort)

在这里,使用方法和tail是一样的。

现在,假设出现了一些有趣的事情,并且您想搜索所有出现的“ foo”。您只需按一下Ctrl-c就可以进入“正常” less 模式(就像您打开文件时,没有带+F参数一样),然后便拥有了所需的所有正常less功能,包括使用/foo来搜索。可以使用nN转到下一个或上一个出现的位置,使用jk向上和向下移动,使用m来创建标记,并执行less可以做的所有事情。

完成后,只需按F键再次回到观看模式。就是这么简单

截断

对于less +F,可以使用-S选项在屏幕宽度处截断行,而tail无论行有多长,您都只能选择显示整个行。

高亮

less -W +F somelogfile

使用-W可以突出显示任何向前滚动(如滚动到下一页)后的第一个(未读)的新行。

着色

less -r +F somelogfile

-r告诉less始终尝试解释颜色输出。

什么时候不应使用less

同时查看多个文件

当您需要同时查看多个文件时,tail -f实际上可以提供更好的输出。

$ tail -f *.txt

==> file1.txt <==
content for first file

==> file2.txt <==
content for second file

==> file3.txt <==
content for third file

当发生更改时,它会打印文件名和新内容,这非常方便。

使用less,它将像这样:

$ less +F *.txt

content for first file

它一次只显示一个文件的内容。
如果要查看第二个文件中发生的情况,则需要首先Ctrl-c进入普通模式,然后键入:n以进入下一个缓冲区,然后F再次键入以返回观看模式。

根据您的需求,可能仍然值得使用less查看多个文件,但是在大多数情况下,我只是tail处理这些情况。

或者可以使用工具multitail,非常好用的一个工具

重要的是要了解我们可使用的工具,并使用合适的工具来完成当前的工作。

管道

less无法配合Pipe使用,例如像下面的命令是无法运行的

less +F /var/log/exim_mainlog | grep "something"

不过less可以使用&pattern来进行模式匹配,可以查看man page获得更多帮助

效率

less +F实际上会读取整个文件,而在许多系统上,tail -f仅读取文件的末尾,即使在读取整个文件的系统上,至少也不会保留整个文件在内存中。这样导致less +F对于非常大的文件来说是不切实际的。

但是,可以运行less -n +F,从而使less只读取文件的结尾,但这不显示行号。

且在less -n +Ftail -f之间,主要区别在于tail在某些平台上使用文件更改通知服务(例如,在Linux上是inotify),该服务允许它立即显示新数据,而less最多可能需要1秒钟才能显示新数据。因为它会循环检查新数据并在两次检查之间休眠。

less +Ftail -f之间的另一个区别是less将调用它的输入过滤器,但这通常不会对日志文件产生任何影响

Reference