我需要脚本逐行打印出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;
答案 0 :(得分:1)
如果您想坚持不使用阵列,这里是获取IP地址的解决方案。
while ($login =~ m/(\d+\.\d+\.\d+\.\d+)/g) {
print "$1\n";
}
答案 1 :(得分:1)
使用/g
查找所有匹配项。
my @ips = /(\d+\.\d+\.\d+\.\d+)/g;
那就是说,你显然想要第4场,所以让我们真的这样做,而不是冒险从第三场获得一些东西。
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];
...
}
答案 2 :(得分: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做任何你想做的事。
此外我在这里使用名为match,这只是我的偏好,你不必使用它。