我有点困在一个我想改编的快速脚本上,所以我想问可能会帮助我继续前进:)
我的第一个tsv文件是一个服务器/主机名列表,如下所示(groups.tsv):
Groupname | Servername
group1 server1
group2 server2
group3 server3 server4 server5
group4 server6
group5 server7
group6 server7
第二个是IP /主机名(addresses.tsv)列表:
Hostname | IP | Purpose
server1 192.168.1.29 255.255.255.255 application1
server2 172.16.9.38 255.255.255.255
server3 10.50.110.28 255.255.255.255
server4 10.0.0.1 255.255.255.255 application2
server5 192.168.1.1 255.255.255.255
server6 172.16.32.32 255.255.255.255
server7 10.0.0.3 255.255.255.255
server8 1.1.1.1 255.255.255.255 application3
server9 127.0.0.1 255.255.255.255
server10 10.28.28.28 255.255.255.255
使用在其他地方找到的perl脚本,我正在尝试获取这样的新tsv文件:
Hostname | IP | Purpose | Groupname
server1 192.168.1.29 255.255.255.255 application1 group1
...
perl脚本如下:
#!/usr/bin/perl
use strict;
use warnings;
my %programs; #Hash to save groupname => hostname for each program record
open my $fh1, '<', 'groups.tsv' or die "Failed to open groups.tsv: $!";
foreach (<$fh1>) {
chomp; #Remove newline character from end of line
my ( $groupname, $hostname ) = split(/\t/);
$programs{$groupname} = $hostname;
}
close $fh1;
open my $fh2, '<', 'addresses.tsv' or die "Failed to open addresses.tsv: $!";
open my $fh3, '>', 'result.tsv' or die "Failed to open result.tsv: $!"; #Output
foreach (<$fh2>) {
chomp; #Remove newline character from end of line
my $groupname = ( split(/\t/) )[1]; #Groupname
if ( exists $programs{$groupname} ) {
print $fh3 "$_\t$programs{$groupname}\n";
} else {
print $fh3 "$_\t*NA*\n";
}
}
在某些时候,我已经部分检索了组名,但这是因为我把它与反转键/值混淆了。我相信我宁愿检查散列的值而不是密钥,但到目前为止我没有成功。
现在我有了这个结果.tsv:
server1 192.168.1.29 255.255.255.255 application1 *NA*
server2 172.16.9.38 255.255.255.255 *NA*
server3 10.50.110.28 255.255.255.255 *NA*
....
本着同样的精神,我将有一个policy.tsv
Groupname | Service
group1 ALL
group2 HTTP
group3 HTTP HTTPS TCP_3389
group3 group4 SSH
所以我的最终目标是拥有这样的最终tsv文件:
Hostname | IP | Purpose | Groupname | Service
server1 192.168.1.29 255.255.255.255 application1 group1 ALL
...
http://www46.zippyshare.com/v/30272792/file.html
但我认为一旦第一部分没问题就可能更容易适应。
有人用perl / hash清楚可以让我领先吗?
提前感谢您的帮助!
答案 0 :(得分:0)
你的哈希是倒退的。您想按主机名查找组名。变化
$programs{$groupname} = $hostname;
到
$groupname{$_} = $groupname for split ' ', $hostname;
然后底部变为
my $hostname = ( split /\t/ )[0];
print $fh3 $_ . "\t" . ( $groupname{$hostname} || '*NA*' ) . "\n";