使用perl将空格分隔为log哈希

时间:2018-01-18 21:54:25

标签: perl hashmap

我想将日志的每一行(只能是2行)存储到单独的哈希中,然后检查每个键值以确定是否有增加或减少。日志文件可能每次都没有匹配的协议,因此第2行缺少rdp,并且可能完全有新的协议,这就是为什么我认为使用散列是一个好主意。

tcp 217837 tls 138531 http 50302 udp 37852 dns 23625 ldap 14160 krb5 8828 smb 2148 ssh 549 ftp 219 smtp 161 icmp 6 rdp 3 ssdp 3
tcp 198650 tls 125770 http 44260 udp 37610 dns 23827 ldap 13904 krb5 8805 smb 2128 ssh 629 ftp 219 smtp 156 icmp 5 ssdp 1

我想要做的是将第一行读入哈希,所以它看起来像这样:

键值

TCP:217837

TLS:138531

然后我想以相同的方式将第二行读入另一个哈希:

键值

TCP:198650

TLS:125770

我怎么能做到这一点?我试图搜索,但许多示例依赖于日志文件格式不同。如果可能,我希望解决方案在Perl中。

2 个答案:

答案 0 :(得分:3)

哈希可以由列表填充,其中连续元素被配对为键值

my %hash = ('a', 1, 'b', 2);   #--> %hash is (a => 1, b => 2)

所以你可以通过在空格上分割每行来做到这一点

open my $fh, $filename or die "Can't open $filename: $!";
my %line_1 = split ' ', <$fh>;
my %line_2 = split ' ', <$fh>;

或者,不要仅限于两行

while (<$fh>) {
    my %line = split;
}

其中split;使用split默认值,因此与split ' ', $_;相同

每次都会创建新的哈希值。即使你在其他地方声明它们并以这种方式反复读入这些变量,它仍然会每次都被覆盖。如果需要将现有哈希读取更新为临时哈希,然后按键更新/检查主哈希密钥。

答案 1 :(得分:0)

while (<>) {
   my %hash = split;
   ...
}

while (<>) {
   push @hashes, { split };
}

...