如何查看整个文件,又如何等待将更多数据添加到该文件?


21

我想读取整个文件并使其等待输入,就像tail -f 显示完整文件一样。

该文件的长度将始终更改,因为这是一个.log文件。

如果我不知道文件的长度,该怎么办?


2
您已经知道尾巴接近您想要的。您是否阅读了手册页?
njzk2

1
less具有“ F”键。如果需要交互,很有用。
托尔比约恩Ravn的安徒生

Answers:


33

tail可让您添加-n以指定要从末尾开始显示的行数,该行数可与结合使用-f。如果该参数-n与开始+即从线的计数开始(01显示整个文件,2指示跳过第一行,通过@Ben所指示的)。所以做:

tail -f -n +0 filename

如果您的日志文件会旋转,你可以添加--retry(或组合-f and --retry-F如@Hagen建议)

还要注意,在图形终端中,您可以使用鼠标和PageUp/ PageDown滚动回到历史记录(假设您的缓冲区足够大),即使您使用Ctrl+ C退出,此信息也将保留在那里tail。如果您less不方便使用AFAIK,则必须使用键盘进行滚动,less如果忘记了以术语开头的话,我不知道有一种方法可以避免对termcap进行初始化-X


1
+1当我发布我的信息时,您的答案就会出现,尽管我的方法可行,但您的答案会更好。
Julie Pelletier

1
当我仍在键入时,我收到一条消息,提示那里还有另一个答案,应该单击以刷新。您的答案可以完成工作,但是对于从一开始进行计数(用强制+)的实施效率更高,我不会感到惊讶。
Anthon 2016年

1
+1为我教+0。您可能想要-F而不是-f轮换日志文件
Hagen von Eitzen

我认为这里是一对一的。tail -n +1为我显示了文件的开头,并tail -n +2跳过了一行。我认为数字是显示的第一行的行号。
Ben Millwood

1
@Anthon谢谢!这正是我所需要的!
malworm

37

有一种更好的方法可以实现此目的:

less +F <file>

它会向您显示整个文件,具有完整的功能,less并会等待新的输入。如果要停止等待输入并阅读特定部分,可以使用停止^C并继续F

F命令是始终可用less,如果你决定,同时具有文件打开在观看更改less,击中F将其打开。感谢hiergiltdiestfu通配符指出这一点。


2
这确实比更好tail。谢谢你的提示; 我永远也不会想到要使用less它。其他提示:您也可以只运行less <file>然后输入F
通配符

3

除了/ u / Anthon的答案,您还可以执行以下操作:

{ cat filename; tail -0f filename; }

-0选项以尾相当于-n 0,意思是:dispaly 0行。但-f将显示新行。

您不需要括号{ }。我之所以使用它们,是因为有时您想以某种方式重定向文件描述符。例如:

{ cat ; tail -0f -; } < /var/log/messages

本·米尔伍德(Ben Milwood)指出:您可能处于竞争状态,其中文件在cat操作结束和操作开始之间增长tail。但这又是学术解决方案的“学术”问题。


3
如果文件在cat完成和tail开始之间增长,则不会看到这些行。可能没什么大不了的,但却是偏爱纯tail解决方案的原因。
Ben Millwood

我认为{ cat; tail -n +0 -f; } < file这会解决问题,因为tail会打印出现在cat退出和tail启动之间的所有新数据。当然,它使cat冗余。重定向仅发生一次,并且tailstdin是cat已经读取到EOF的文件描述符,因此其当前位置在此位置cat。您可以通过将放入echo foo >> file内部来进行测试{},以每次创建比赛。
彼得·科德斯

2

watch 命令应该为您做到这一点。

您也可以尝试

less +FG 

less当您说文件很大时,可以通过命令使用更多选项来滚动浏览文件。


少也不会跟随不断增长的文件。
Shadur

7
@Shadur,确实如此,这就是该+F选项的选择
glenn jackman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.