匹配日志文件中的字段并转换结果

时间:2015-02-27 02:11:14

标签: regex perl

首先快速介绍一下。我是新来的,所以如果我搞了一个帖子,请告诉我,我会修复它。

我一直在尝试使用perl来实现我的目标,但是我被卡住了。我不需要使用perl来完成它,但我认为它是,或Excel和我更喜欢perl。如果你有更好的方法请分享。

我从一个文件开始(从日志文件输出)。它是1行,由冒号分隔的字段。以下是该文件的示例:

RmDenySumm:SGID=46244:Req=15000:tsid=46244:AllocBw=38332:BwList=12456/12500/3750/5876/3750:tsid=63042:AllocBw=38750:BwList=15000/12500/3750/3750/3750:tsid=63043:AllocBw=36717:BwList=14706/12500/3750/5761:tsid=63044:AllocBw=37011:BwList=15000/12500/5761/3750:tsid=61741:AllocBw=38450:BwList=12339/3750/6501/12502/3357:tsid=61721:AllocBw=37460:BwList=12500/15000/4200/5760:tsid=2072:AllocBw=31975:BwList=12136/12339/3750/3750:tsid=2073:AllocBw=24260:BwList=14634/5876/3750:tsid=30842:AllocBw=38453:BwList=14634/12500/5761/5557:tsid=30843:AllocBw=37105:BwList=15000/15000/3750/3355:tsid=30844:AllocBw=38295:BwList=14706/12339/3750/3750/3750:tsid=30845:AllocBw=25601:BwList=5762/12339/3750/3750:tsid=30846:AllocBw=38455:BwList=15000/12136/5761/5557:tsid=30847:AllocBw=26974:BwList=14634/12339:tsid=30848:AllocBw=29634:BwList=14634/15000:tsid=30849:AllocBw=37338:BwList=14838/15000/3750/3750:tsid=60958:AllocBw=36898:BwList=12339/12500/6501/5557:tsid=60959:AllocBw=37178:BwList=12339/12500/12339:tsid=60960:AllocBw=27339:BwList=12339/15000:tsid=60962:AllocBw=34839:BwList=12339/3750/15000/3750:tsid=60963:AllocBw=37500:BwList=15000/15000/3750/3750:tsid=60964:AllocBw=38346:BwList=15000/3754/15000/4592:tsid=60965:AllocBw=24626:BwList=15000/5876/3750:tsid=60966:AllocBw=34513:BwList=12502/12500/5761/3750

我需要抓取所有"AllocBW=######"字段,将数字部分与"AllocBW"分开,将它们全部加在一起,然后从设定值中减去它们。

在perl中,我有这个:

#!/usr/bin/perl -w
use Data::Dumper;
#
#
my $file = "/home/nick/perl/svcgroup.txt";
my @asplit;
my $c = 0;
open (FILE, "<", $file) or die "Can't open file".$!."\n";

while (<FILE>) {
        $_ =~ s/\n//g;
        push(@asplit, split (":", $_));
        #print Dumper @asplit;

}

foreach $splits (@asplit) {
        if ($splits =~ m/AllocBw/) {
        print $splits."\n";
        }
}
#print Dumper @asplit;
print "\n\n";
close FILE;
exit;

让我失望:

AllocBw=38332
AllocBw=38750
AllocBw=36717
AllocBw=37011
AllocBw=38450
AllocBw=37460
AllocBw=31975
AllocBw=24260
AllocBw=38453
AllocBw=37105
AllocBw=38295
AllocBw=25601
AllocBw=38455
AllocBw=26974
AllocBw=29634
AllocBw=37338
AllocBw=36898
AllocBw=37178
AllocBw=27339
AllocBw=34839
AllocBw=37500
AllocBw=38346
AllocBw=24626
AllocBw=34513

这是我被卡住的地方。我不确定如何将这些值删除到数字并添加它们。

如果有人可以提供帮助,我将不胜感激。如果使用Perl之外的其他东西更容易实现,那也很好。我的编程范围有限,因为我只制作小脚本来完成工作中的小重复任务。

编辑BORODIN

ie(没有这样格式化,这只是为了说明):

AllocBw 12575+
AllocBw 12568+
AllocBw 12358 = TotAllocBw 37501

MaxBw 38800*3=116400

116400(MaxBw) - 37501(TotAllocBw) = TotAvaiBw 78899

这只是一个很大的好处。您编写的脚本非常适合我的目的,我可以根据需要进行调整。再次感谢!非常感激。我能够在脚本中跟踪你所做的不同的事情,并学习了一些新东西..也感谢你。

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用全局正则表达式匹配来查找输入文件每行中出现的所有AllocBw=...

该程序的外部while循环遍历输入文件中的所有行,因此只应执行一次。

内部while遍历正则表达式模式的所有实例AllocBw=(\d+)AllocBw=后跟任意数量的十进制数字)并将数值捕获到$1

每次将捕获的号码添加到$total,最后可以直接打印。

use strict;
use warnings;

my $file = '/home/nick/perl/svcgroup.txt';

open my $fh, '<', $file or die qq{Unable to open "$file" for input: $!};

my $total = 0;

while ( <$fh> ) {
  $total += $1 while /AllocBw=(\d+)/g;
}

printf "Total: %d\n", $total;

<强>输出

Total: 826049