+ -
当前位置:首页 → 问答吧 → 有木有更快的处理办法了!!!

有木有更快的处理办法了!!!

时间:2011-07-08

来源:互联网

本帖最后由 xxhacker 于 2011-07-08 14:24 编辑

我的日志文件格式大体是这样的:
00:00:01 [cmd:ACCEPT,tid:UMCowKALITMBNRNOk+xwAA--.488S0,ip:204.74.212.204......
00:00:02 [cmd:MAIL,tid:UMCowKALITMBNRNOk+xwAA--.488S2,ip:204.74.212.204......
00:00:02 [cmd:RCPT,tid:UMCowKALITMBNRNOk+xwAA--.488S2,ip:204.74.212.204......
日志文件大小为2个G左右,压缩后为400多M,格式为xxx.gz

目的:想统计这个日志文件ACCEPT的会话数

命令实现: zcat xxx.gz|wc -l 大概是21秒左右
perl实现:大概是在19秒左右
  1. #! /usr/bin/perl
  2. use warnings;
  3. use strict;

  4. my $count;
  5. my $file = 'xxx.gz';
  6. open FH,"gzip -dc $file|" or die "Can't open $file:$!\n";
  7. while (<FH>) {
  8.     $count ++ if (/ACCEPT/);
  9. }
  10. print $count."\n";
复制代码
问题:有木有理快的处理办法了?

作者: xxhacker   发布时间: 2011-07-08

本帖最后由 x9x9 于 2011-07-08 14:54 编辑
  1. while (<FH>) {
  2. $count++ if (substr($_,14,1) eq 'A');
  3. }
复制代码

作者: x9x9   发布时间: 2011-07-08

楼上的代码应该能提高一点速度

作者: iamlimeng   发布时间: 2011-07-08

测试了一下2楼的代码,22秒左右

作者: xxhacker   发布时间: 2011-07-08

  1. /^\d{2}:\d{2}:\d{2}\s+\[cmd:ACCEPT/
复制代码
用这个正则可能会快点。

作者: wxlfh   发布时间: 2011-07-08

回复 wxlfh

测了一下,20秒左右,难道已经是极限了???

作者: xxhacker   发布时间: 2011-07-08

本帖最后由 jason680 于 2011-07-08 16:23 编辑

$/="ACCEPT";
$count++ while(<FH>);

or use C language

作者: jason680   发布时间: 2011-07-08

回复 jason680

测试了一下,23秒,看来要获得更快的处理速度,只能把改写代码为C了,可惜我C不熟

作者: xxhacker   发布时间: 2011-07-08