免费注册 查看新帖 |

Chinaunix

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

求助,求日志文件里指定列以及尾值之和 [复制链接]

论坛徽章:
1
金牛座
日期:2014-03-21 18:22:34
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-26 15:58 |只看该作者 |倒序浏览
20可用积分
本帖最后由 lockeyou 于 2014-01-26 16:04 编辑

180.153.120.57                2201        222.73.112.230                80                3
180.153.120.57                2202        222.73.112.230                80                5
180.153.120.57                2203        222.73.112.230            80            9
180.153.120.101        9801        221.204.169.127        33940        4
180.153.120.101        9801        221.204.169.127        37128        4
180.153.120.101        9801        221.204.169.127        3057                4
180.153.120.101        9801        221.204.169.127        33940        4
180.153.120.101        9801        221.204.169.127        37128        4

上面是data1.log

想要生成文件res.log
180.153.120.57           222.73.112.230        17      3
180.153.120.101  221.204.169.127           20      4

具体理解可以为第二第四列不管.统计第一第三列相同的ip值,并且求出第五列值之和 后面再添加有几行这样的数据
嘿嘿,分不多.不知道有没有朋友做过类似的日志处理

最佳答案

查看完整内容

#!/usr/bin/perluse strict;use warnings;my (%hash, %i);for(){ /(\S+)\s+\d+\s+(\S+)\s+\d+\s+(\S+)/; $hash{$1}{$2} += $3; $i{$1}{$2}++;}for my $key (keys %hash and keys %i){ for (keys $hash{$key}){ print "$key\t $_ \t$hash{$key}{$_}\t $i{$key}{$_}\n"; }}__DATA__180.153.120.57 2201 222.73.112.230 80 3180.153.120.57 2202 ...

论坛徽章:
0
2 [报告]
发表于 2014-01-26 15:58 |只看该作者
#!/usr/bin/perl

use strict;
use warnings;

my (%hash, %i);

for(<DATA>){
    /(\S+)\s+\d+\s+(\S+)\s+\d+\s+(\S+)/;
    $hash{$1}{$2} += $3;
    $i{$1}{$2}++;
}
for my $key (keys %hash and keys %i){
     for  (keys $hash{$key}){
             print "$key\t $_ \t$hash{$key}{$_}\t $i{$key}{$_}\n";
     }
}



__DATA__
180.153.120.57         2201        222.73.112.230           80                3
180.153.120.57         2202        222.73.112.230           80                5
180.153.120.57         2203        222.73.112.230            80            9
180.153.120.101        9801        221.204.169.127        33940        4
180.153.120.101        9801        211.155.101.163        37128        4
180.153.120.101        9801        115.238.240.185        3057                4
180.153.120.101        9801        211.155.101.163        33940        4
180.153.120.101        9801        221.204.169.127        37128        4

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
3 [报告]
发表于 2014-01-26 16:41 |只看该作者
  1. $ perl -lane '$s{$F[0]}{$F[2]}+=$F[4];$t{$F[0]}{$F[2]}++;END{for $k (keys %s){for (keys %{$s{$k}}){print join "\t",$k,$_,$s{$k}{$_},$t{$k}{$_}}}}' i
  2. 180.153.120.101 221.204.169.127 20      5
  3. 180.153.120.57  222.73.112.230  17      3
复制代码

论坛徽章:
1
金牛座
日期:2014-03-21 18:22:34
4 [报告]
发表于 2014-01-26 16:45 |只看该作者
大牛,能不能把这个写成不是一行的哇,我想写成那种简单脚本形式的哦
类:
#!/usr/bin/perl
use v5.16;
use Data:umper;

嘿嘿.谢谢!

论坛徽章:
0
5 [报告]
发表于 2014-01-26 16:54 |只看该作者
  1. #!/usr/bin/perl -w

  2. use strict;

  3. my %all;

  4. open IN, '<data1.log' or die "Can't open file: $!\n";
  5. while (<IN>) {
  6.         chomp;
  7.         my ($sip, $tip, $val) = (split)[0,2,4];

  8.         $all{$sip}{$tip}{'count'}++;
  9.         $all{$sip}{$tip}{'sum'} += $val;
  10. }

  11. open OUT, '>res.log' or die "Can't open file: $!\n";

  12. foreach my $sip (sort keys %all ) {
  13.         foreach my $tip (sort keys %{ $all{$sip} }) {
  14.                 print OUT "$sip\t$tip\t$all{$sip}{$tip}{'count'}\t$all{$sip}{$tip}{'sum'}\n";
  15.         }
  16. }
复制代码

论坛徽章:
1
金牛座
日期:2014-03-21 18:22:34
6 [报告]
发表于 2014-01-26 16:57 |只看该作者
回复 5# junglegq
亲,谢谢哈,不过楼上的快了一点.还是很感谢你,好人

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
7 [报告]
发表于 2014-01-26 17:02 |只看该作者
回复 4# lockeyou
  1. #!/usr/bin/perl
  2. my ( %s, %t );
  3. while (<DATA>) {
  4.         @_ = split;
  5.         $s{$_[0]}{$_[2]} += $_[4];
  6.         $t{$_[0]}{$_[2]} ++;
  7. }
  8. for my $k ( keys %s ) {
  9.         for ( keys %{$s{$k}} ) {
  10.                 print join "\t", $k, $_, $s{$k}{$_}, $t{$k}{$_} . $/;
  11.         }
  12. }
  13. __DATA__
  14. 180.153.120.57                2201        222.73.112.230                80                3
  15. 180.153.120.57                2202        222.73.112.230                80                5
  16. 180.153.120.57                2203        222.73.112.230            80            9
  17. 180.153.120.101        9801        221.204.169.127        33940        4
  18. 180.153.120.101        9801        221.204.169.127        37128        4
  19. 180.153.120.101        9801        221.204.169.127        3057                4
  20. 180.153.120.101        9801        221.204.169.127        33940        4
  21. 180.153.120.101        9801        221.204.169.127        37128        4
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP