免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11340 | 回复: 15
打印 上一主题 下一主题

有木有更快的处理办法了!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-08 14:22 |只看该作者 |倒序浏览
本帖最后由 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";
复制代码
问题:有木有理快的处理办法了?

论坛徽章:
0
2 [报告]
发表于 2011-07-08 14:52 |只看该作者
本帖最后由 x9x9 于 2011-07-08 14:54 编辑
  1. while (<FH>) {
  2. $count++ if (substr($_,14,1) eq 'A');
  3. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2011-07-08 14:57 |只看该作者
楼上的代码应该能提高一点速度

论坛徽章:
0
4 [报告]
发表于 2011-07-08 15:01 |只看该作者
测试了一下2楼的代码,22秒左右

论坛徽章:
1
未羊
日期:2014-09-08 22:47:27
5 [报告]
发表于 2011-07-08 15:30 |只看该作者
  1. /^\d{2}:\d{2}:\d{2}\s+\[cmd:ACCEPT/
复制代码
用这个正则可能会快点。

论坛徽章:
0
6 [报告]
发表于 2011-07-08 15:37 |只看该作者
回复 5# wxlfh

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

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
7 [报告]
发表于 2011-07-08 16:15 |只看该作者
本帖最后由 jason680 于 2011-07-08 16:23 编辑

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

or use C language

论坛徽章:
0
8 [报告]
发表于 2011-07-08 16:33 |只看该作者
回复 7# jason680

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

论坛徽章:
0
9 [报告]
发表于 2011-07-08 18:38 |只看该作者
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int main ()
  5. {
  6.         FILE * pFile;
  7.     char readbuff[1024]={0};
  8.     long nCount=0;
  9.         char *pStr;
  10.         char pResult[7] = {0};
  11.    
  12.     pFile = fopen ("test.txt","rb");
  13.     if (pFile==NULL)
  14.     {
  15.         fputs("File error",stderr);
  16.         exit (1);
  17.     }
  18.     while(fgets(readbuff,1024,pFile) != NULL)
  19.     {
  20.                 pStr = strstr(readbuff,"ACCEPT");
  21.                 if (pStr == NULL)
  22.                         continue;
  23.                 strncpy(pResult, pStr, 6);
  24.                 if (strcmp(pResult,"ACCEPT") == 0)
  25.                         ++nCount;
  26.     }
  27.        
  28.         printf("the number of ACCEPT is:%ld\n", nCount);
  29.     fclose (pFile);
  30.     return 0;
  31. }
复制代码
写了个简单C的

论坛徽章:
0
10 [报告]
发表于 2011-07-08 18:40 |只看该作者
如果日志每行只有一处会出现ACCEPT,那稍微改成
  1. pStr = strstr(readbuff,"ACCEPT");
  2. if (pStr == NULL)
  3.         continue;
  4. else
  5.         ++nCount;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP