怎么打印文件的后10行

怎么打印文件的后10行

1,怎么打印文件的后10行(这个文件有3万多行吧)!
2,怎么打印带有"error"行的前十行(包括error所在的行)!

谢谢! 说说思路也行,或者是要用到个模块!
1,tail -10 /path/to/foo
2,grep -B 10 error /path/to/foo


QUOTE:
原帖由 veryperson 于 2008-9-16 19:45 发表
1,怎么打印文件的后10行(这个文件有3万多行吧)!

你可以把文件全部读进来,然后取最后十行;对于特别大的文件也可从后往前按块读取,然后再分行,取最后十行。另外也可以考虑使用 Tie::File

QUOTE:
2,怎么打印带有"error"行的前十行(包括error所在的行)!

这个你把文件遍历一下就完了。

ls 的非要把简单的事情复杂化啊


QUOTE:
原帖由 cobrawgl 于 2008-9-17 09:45 发表
ls 的非要把简单的事情复杂化啊

当然不是了。直接调用已有的程序会有移植性问题,而直接把全部文件读入会有性能问题。许多问题就是那么复杂(其实楼主的问题也没多复杂 ),没办法。
to MMMIX:
对于小文件来说,不存在性能问题;对于大文件来说,最好的办法是从后面往前面读(不考虑有空洞的情形)。

tail 正是这么做的。如果要自己实现 tail,也可以,大概思路就是把文件长度按照 4096 取整,
然后从最后一个磁盘块往前读,读一个块就数数里面有几行,取够需要的行就终止循环。
感谢flw的回复!

用shell这么简单, 我何必想着用perl呢

多谢,但最好是用perl实现下!  因为我想知道perl怎么才能向上以行为单位移动指针!  
同样感谢您的回复!


你的思路我正思考中.......!  


谢谢!


QUOTE:
原帖由 flw 于 2008-9-17 12:50 发表
to MMMIX:
对于大文件来说,最好的办法是从后面往前面读(不考虑有空洞的情形)。

是应该从后往前读。
File::ReadBackwards