题目
有100个日志文件,每个文件大约1G,每条日志都以 “H:i:s” 的时间格式开头,如:
1 |
05:02:04 xxx yyy zzz |
因为是日志文件,所以肯定以时间为顺序的,现在可以确定的是,在某个文件中存在一条 01:02:03 这个时间点的关于xxx的日志,要找出来 ,如何做?
办法1:
1 |
# for f in *; do awk '/^01:02:03/{}' $f |grep xxx; done |
虽然我们的正则是只匹配行首,算是很快的了,但是,我们还是扫描了整个的100个文件;考虑到每个文件肯定都是有时间顺序的,我们做了大量的无用的工作,其实完全可以提前退出的,加入每10分钟都会有日志出现,则可以优化如下:
办法2:
1 |
# for f in *; do awk '/^01:02:03/{} /^01:1/{exit}' $f |grep xxx; done |
这样的话,没个文件只扫描很少的一部分就可以了
办法3:
该题的sed解法:
1 |
# for f in *; do sed -n '/^01:02:03/p; /^01:1/q}' $f |grep xxx; done |
办法4:
当然,将 xxx 并入正在表达式也是可以的(只是没有上面看起来更一目了然):
1 |
# for f in *; do sed -n '/^01:02:03.xxx/p; /^01:1/q}' $f ; done |