如何在perl中使用split函数来完成awk的工作

Cle*_*Dev 2 regex perl awk

我正在用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?

Sob*_*que 5

平凡.默认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术语).


mkH*_*Hun 5

对于类似用途 perl oneliner

perl -nae 'print "$F[3]\n"' input.txt
Run Code Online (Sandbox Code Playgroud)

-n为文件创建循环

-a自动分割模式。默认情况下用空格分割。输出存储到@F. 所以我使用第三个索引来打印IP地址。在perl中索引从0开始