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

标签 regex perl awk

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

相关文章:

java - 正则表达式模式匹配器

bash - 将文本文件转换为逗号分隔的字符串

date - awk:防止结果被解释为 shell 命令

java - 从 java 调用 perl

perl 依赖管理 extUtils::Installed list into a container

linux - 可能是 grep,但仍然不知道如何读取 file1 中的行并将其粘贴为 file2 中的列

regex - 以编程方式,Youtube Content ID如何工作?

javascript - 带有特殊字符 (.) 的正则表达式字边界 javascript

python - RegEx Python - 我想编写 RegEx,通过它我可以将 { expression } 替换为 {% print expression %}

regex - 在段落中查找匹配的字符串