1

我需要脚本与相应的用户名和电子邮件地址以及国家/地区逐行打印出 IP 地址列表。如何获取多个 IP 地址来执行命令?我试着做一个循环,但它只显示了一行 IP 地址。我希望我的输出看起来像:

1 | login | emailadd@yahoo.com | 160.79.208.82 | United States
16 | login1 | emailadd@yahoo.com | 61.95.83.10 | Italy
23 | login2 | emailadd@gmail.com | 81.48.63.93 | Australia
36 | login3 | emailadd@yahoo.com | 38.117.170.82 | Japan
51 | login4 | emailadd@gmail.com | 2.233.30.85 | Mexico

这是我的代码:

#!/usr/bin/perl -w
use lib '~/lib';
use strict;
use Net::IPInfoDB;

my $g = Net::IPInfoDB->new;
$g->key(api_key);

my $login = '1 | login | emailadd@yahoo.com | 160.79.208.82
            16 | login1 | emailadd@yahoo.com | 61.95.83.10 
            23 | login2 | emailadd@gmail.com | 81.48.63.93 
            36 | login3 | emailadd@yahoo.com | 38.117.170.82 
            51 | login4 | emailadd@gmail.com | 2.233.30.85';

$login =~ /(\d+\.\d+\.\d+\.\d+)/;

my $city = $g->get_city("$1");
my $addr = $g->get_country("$1");


printf "$login | (%s, %s)\n",
$city->city_name, $addr->country_name;
4

3 回答 3

1

如果您想坚持不使用阵列,这里有一个获取 IP 地址的解决方案。

while ($login =~ m/(\d+\.\d+\.\d+\.\d+)/g) {
    print "$1\n";
}
于 2013-11-14T15:16:08.603 回答
1

用于/g查找所有匹配项。

my @ips = /(\d+\.\d+\.\d+\.\d+)/g;

也就是说,您显然想要第四个字段,所以让我们实际这样做,而不是冒险从第三个字段中得到一些东西。

sub trim { my ($s) = @_; $s =~ s/^\s+//; $s =~ s/\s+\z//; $s }

for (split /^/m, $login) {
   chomp;
   my @fields = map trim($_), split /\|/;
   my $ip = $fields[2];
   ...
}
于 2013-11-14T15:20:13.627 回答
0

您只会获得一个 IP 地址,因为这正是您在整个 $login 上应用正则表达式 ONCE 所做的事情。

#we split $login into an array, line-by-line
my @lines = split("\n",$login);
for my $line (@lines) {
    #now we iterate through every line one-by-one
    $line =~ /(?<ip>\d+\.\d+\.\d+\.\d+)/;

    print $+{"ip"}."\n";
}

在这里,我们遍历 $login 上的每一行,并为每一行单独应用正则表达式。而不是打印 ofc,您可以使用该 ip 做任何您想做的事情。

另外我在这里使用命名匹配,这只是我的偏好,你不必使用它。

于 2013-11-14T15:13:02.253 回答