我正在用perl编写脚本,我想尽可能避免使用外部命令作为awk,tr等.这是我在脚本中运行的命令,使用反引号:
my @arr = `$cmd | tr " " "\n" | xargs -n1 host | awk '{print $4}'`
Run Code Online (Sandbox Code Playgroud)
这是输出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
Run Code Online (Sandbox Code Playgroud)
这是输出awk '{print 4$}:
10.90.207.59
10.90.207.34
10.90.207.56
10.90.207.67
Run Code Online (Sandbox Code Playgroud)
我希望每个IP都在数组中的单独单元格中.我怎样才能使用perl函数(可能是split或map)而不是使用awk和tr?
平凡.默认split工作就像awk.所以:
my @arr = split;
print $arr[3]; #note - arrays start at zero.
Run Code Online (Sandbox Code Playgroud)
但是,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
Run Code Online (Sandbox Code Playgroud)
但如果你正在寻找一个单一的东西:
#!/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
Run Code Online (Sandbox Code Playgroud)
我们<DATA>在列表上下文中读取,因此它返回整个事物 - 一次一个元素来映射.
然后在map我们分裂每个,并抓住元素3($4以awk术语).
对于类似用途 perl oneliner
perl -nae 'print "$F[3]\n"' input.txt
Run Code Online (Sandbox Code Playgroud)
-n为文件创建循环
-a自动分割模式。默认情况下用空格分割。输出存储到@F. 所以我使用第三个索引来打印IP地址。在perl中索引从0开始