Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 匹配日志文件中的字段并转换结果_Regex_Perl - Fatal编程技术网

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

Regex 匹配日志文件中的字段并转换结果,regex,perl,Regex,Perl,首先是一个简短的介绍。我是新来的,所以如果我搞砸了一个帖子,请让我知道,我会修复它 我一直在尝试使用perl实现我的目标,但我被卡住了。我不需要使用perl来完成它,但我想就是这样,或者Excel,我更喜欢perl。如果你有更好的方法,请分享 我从一个文件开始(从日志文件输出)。它是一行,字段由冒号分隔。以下是该文件的一个示例: RmDenySumm:SGID=46244:Req=15000:tsid=46244:AllocBw=38332:BwList=12456/12500/3750/587

首先是一个简短的介绍。我是新来的,所以如果我搞砸了一个帖子,请让我知道,我会修复它

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

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

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;
这就是我被卡住的地方。我不知道如何将这些值拆分为数字并相加

如果有人能帮忙,我将不胜感激。如果使用Perl以外的东西更容易实现这一点,那也没关系。我的编程范围是有限的,因为我只制作小脚本来完成工作中的小重复任务

为BORODIN编辑

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


这将是一笔巨大的奖金。你写的剧本非常适合我,我可以根据需要改编。再次感谢!非常感谢。我能够理解你在剧本中所做的每一件不同的事情,并学到了一些新东西。。同样感谢您。

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

该程序的外部
while
循环在输入文件中的所有行上迭代,因此只应执行一次

内部
while
迭代regex模式的所有实例
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;

必须始终
使用严格
使用警告
(优先于
-w
shebang线路开关)。否则,使用
my
来声明变量没有什么意义,您应该尽可能靠近它们的第一个使用点,而不是全部放在程序顶部的一个块中。最好使用词法文件句柄而不是全局句柄,因此
$file
而不是
file
,或者更好的
$fh
文件句柄谢谢您的提示。我通常使用strict,但我在这一个中忘记了。你帮了大忙。非常感谢。
AllocBw 12575+
AllocBw 12568+
AllocBw 12358 = TotAllocBw 37501

MaxBw 38800*3=116400

116400(MaxBw) - 37501(TotAllocBw) = TotAvaiBw 78899
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