我正在用 perl 编写脚本,我想尽可能避免使用 awk、tr 等外部命令。 这是我从脚本内部运行的命令,使用反引号:
my @arr = `$cmd | tr " " "\n" | xargs -n1 host | awk '{print $4}'`
这是没有 awk '{print 4$}
的输出:
$fileserver has address 10.90.207.59
$fileserver has address 10.90.207.34
$fileserver has address 10.90.207.56
$fileserver has address 10.90.207.67
这是 awk '{print 4$}
的输出:
10.90.207.59
10.90.207.34
10.90.207.56
10.90.207.67
我希望每个 IP 位于数组中的一个单独的单元格中。 我怎样才能当前使用 perl 函数(可能是 split 或 map)而不是使用 awk 和 tr?
最佳答案
琐碎的。默认 split
就像 awk
一样工作.所以:
my @arr = split;
print $arr[3]; #note - arrays start at zero.
然而,perl 通常也逐行处理文件句柄,以及 split
得到你不想要的东西。
您可以:
#!/usr/bin/perl
use strict;
use warnings;
while (<DATA>) {
my ($ip) = (split)[3];
print $ip, "\n";
#or push it.
}
__DATA__
$fileserver has address 10.90.207.59
$fileserver has address 10.90.207.34
$fileserver has address 10.90.207.56
$fileserver has address 10.90.207.67
但是如果你正在寻找一个简单的东西:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @ips = map { (split)[3] } <DATA>;
print Dumper \@ips;
__DATA__
$fileserver has address 10.90.207.59
$fileserver has address 10.90.207.34
$fileserver has address 10.90.207.56
$fileserver has address 10.90.207.67
我们阅读<DATA>
在列表上下文中,所以它返回整个东西——一次一个元素来映射。
然后在 map
我们拆分每个,并获取元素 3
(awk 术语中的 $4
)。
关于regex - 如何在 perl 中使用 split 函数来完成 awk 的工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39445990/