我正在尝试使用分页来尾随文件:
tail -f foo.txt | more
这个过程很好,直到文件被注入了 200 行,当这种情况发生时,tail
命令的本质是转到文件末尾,此时我就无法跟踪日志了。
有办法避免这种情况吗?
答案1
改用tail -f log.txt | less
。根据我的快速测试,它会更新以推进新信息,然后您可以向上或向下。即,较少的更新作为输出缓冲区,而不是静态引用原始内容。
或者,稍微改变一下,减少移动部件(没有管道)——Dolphin 在评论中提到的解决方案——less +F log.txt
是一个不错的选择。以下是手册页的内容F
:
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.)
换句话说,这对于这个案例来说是完美的。
不过,它有一个问题,让我没能把它列为我的最爱。添加类似功能less +F daemon.log | egrep session
不起作用。
我继续在日常命令行工作中使用管道的一个原因是,当与历史记录结合使用时,可以非常轻松地返回、添加管道并根据数据指示更改命令的行为。如果tail -f log
由于屏幕上滚动的数据量太大而导致简单命令无法正常工作,请将管道设置为较少。如果数据量太大,但您看到了要查找的行的提示,请将管道添加到 grep 或 egrep。然后链接 awk、sed 或 cut,以获得您想要的结果。
这也是为什么“不必要地使用 cat”经常受到荒谬批评的原因。如果您 cat 了一个文件,但发现它出乎意料地长,请使用 shell 历史记录,按向上箭头并对其进行其他操作。快速修复?只需添加cat foo | more
。它有多长?向上箭头和| wc
。有多少行带有“pangloss”?添加| egrep pangloss | wc
。如果您可以启动命令并确切知道您的调查将进行到哪里,那就太好了,但是如果您不能,历史记录和管道是完成任务的好方法。即使它很丑陋,也可以cat file | more | egrep something
正常工作。
答案2
我的解决方案是这样的:
less some-file.log
然后,less
我按下Shift+ F。这将导致less
文件更新。要向后滚动,只需按下Ctrl+ C。
答案3
用这种方法其实不行。你尝试使用的程序都限制数据,但限制方式却大不相同。
尝试
watch -n 5 tail -n 40 /var/log/thingy
这将每 5 秒更新一次尾部显示。
这是我能得到的最接近的答案,但这不是你想要的。
问题是 more 需要一次性读取所有数据,而 tail 仍在继续传输。如果您只是想反复阅读最后几行,watch 就可以了。如果您只想保留日志并向后滚动,那么请使用控制台后台缓冲区。
在 X 中这将是滚动条,如果你在真正的控制台上,那么你必须使用类似的东西:
kernel /vmlinuz root=/dev/sdb5 video=radeonfb fbcon=scrollback:128
在启动时增加尺寸。然后您可以使用 Shift UP 和 Shift Down 滚动。
在 X 中这要容易得多。只需
tail -f /var/log/something.log
并来回滚动。您可以按 Enter 键来创建当前位置的视觉中断。
在 VTY 中,您需要使用向上移动和向下移动来完成相同的操作,如果您需要更多向后滚动,请使用fbcon=scrollback:128
启动时的参数。