Linux 下遍历大文件每一行的最佳方法,最好是命令

2015-12-05 10:46:00 +08:00
 vus520
via: http://liuzhiqiangruc.iteye.com/blog/1454797

原始需求是想监控文件增加的每一行,传给外部程序处理。

实际上的办法是定时遍历文件的每行,再传给外部程序处理。
5320 次点击
所在节点    问与答
94 条回复
angelface
2015-12-05 10:49:21 +08:00
iNotify
angelface
2015-12-05 10:50:06 +08:00
RemRain
2015-12-05 10:53:22 +08:00
tail -f
程序实现的话, 2.6.32 内核以上用 inotify ,也可以直接用 libev
clino
2015-12-05 11:00:42 +08:00
tail -f +1
xufang
2015-12-05 11:09:15 +08:00
awk 比 perl 要快的,楼主你没用对。
不信的话,楼主可以把你这个发到 ChinaUnix 的 Shell 板块,一堆人会给出更快的方案。

不过我现在喜欢用 golang 来做这样的事情,因为楼主你注意到没有,这些脚本写得再高效,也只能单核运行,很难利用多核上。

而 golang 的话,天然支持多核,用起来很方便。
http://rodaine.com/2015/04/async-split-io-reader-in-golang

用这种模式处理大文件话,立马层次就不一样了。
xufang
2015-12-05 11:09:50 +08:00
楼上给出 tail 的,明显是看帖不回帖的,楼主不用理他们。
vus520
2015-12-05 11:12:26 +08:00
@xufang go lang 大法好
vus520
2015-12-05 11:14:25 +08:00
@clino tail 可以从头开始遍历一个文件吗,没有找到参数
xufang
2015-12-05 11:19:30 +08:00
而且 golang 的正则引擎虽然残废不完备,但是比较快。秒杀了很多脚本语言。
具体可以见 russ cox (golang 主要贡献者)的论文
《 Regular Expression Matching Can Be Simple And Fast 》
https://swtch.com/~rsc/regexp/regexp1.html

这标题,啧啧,狠狠的打脸啊。
skydiver
2015-12-05 11:22:34 +08:00
@vus520 可以。 tail -n +N 就是从头第 N 行开始,想从头开始直接 tail -f -n +1 就可以了
skydiver
2015-12-05 11:23:14 +08:00
@xufang
skydiver
2015-12-05 11:25:10 +08:00
@xufang 吹 Go 没关系,用不着靠贬低 tail 来说事儿,不觉得拿 Go 和 tail 比太 low 了么。
另外不要养成没事儿扣帽子的习惯。
xufang
2015-12-05 11:26:34 +08:00
@skydiver tail 的楼主的原始需求,亲。楼主后来的需求是遍历大文件每一行哦。
skydiver
2015-12-05 11:28:08 +08:00
@xufang 另外 lz 题目里写了最好是命令,回复 tail 怎么就成了回帖不看贴了
哦,你说的看贴不回贴。我们这不是回帖了么,怎么叫不回贴了
skydiver
2015-12-05 11:29:08 +08:00
@xufang 这个需求 tail 就可以满足,而且还满足 lz 说的最好是命令
xufang
2015-12-05 11:29:09 +08:00
@xufang 打快了就发出了。

原始需求用 tail -f 没错,新需求和 tail 完全不搭嘎。
awk/perl 适合,我鼓吹一下 golang 也挺适合。并不是那它和 tail 比啊。
xufang
2015-12-05 11:30:57 +08:00
@skydiver 这,如果是 tail -f -n +1 完全是赶鸭子上架,后面正则匹配和替换等等,完全不搞不定。
skydiver
2015-12-05 11:31:41 +08:00
@xufang 你需要看看 lz 的原始需求。
并没有什么新需求, lz 说了那只是实际上的办法。
有好的办法解决原始需求,何必纠结这个实际方法。
skydiver
2015-12-05 11:32:47 +08:00
@xufang 通过管道传给 awk sed perl 或者自己写的程序处理就可以了,这就是*nix 哲学
xufang
2015-12-05 11:37:33 +08:00
@skydiver 你看下楼主的帖子。那三个脚本

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/241308

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX