当前位置:  开发笔记 > 编程语言 > 正文

Perl:从文件中的每一行抓取第n个和第m个分隔的单词

如何解决《Perl:从文件中的每一行抓取第n个和第m个分隔的单词》经验,为你挑选了4个好方法。

由于在Nagios中添加要监视的主机的繁琐方式(它需要定义主机对象,而不是之前只需要IP和主机名的程序),我认为最好自动执行此操作,并且它这是学习Perl的好时机,因为目前我所知道的只有C/C++和Java.

我读的文件如下所示:

xxx.xxx.xxx.xxx hostname #comments. i.dont. care. about

我想要的只是前2个字符串.这些显然是空间划界的,但为了一般性,它也可能是任何东西.为了使它更通用,为什么不是第一个和第三个,或第四个和第十个?当然必须有一些正则表达式的行动,但我暂时不会留下那个标签,以防万一.



1> slim..:

如果您没有编写更多Perl来处理结果,那么单线程很棒.

但更一般地说,在更大的Perl程序的上下文中,您可以编写自定义正则表达式,例如:

if($line =~ m/(\S+)\s+(\S+)/) {
     $ip = $1;
     $hostname = $2;
}

...或者您将使用拆分运算符.

my @arr = split(/ /, $line);
$ip = $arr[0];
$hostname = $arr[1];

无论哪种方式,添加逻辑以检查无效输入.



2> Chris Jester..:

让我们把它变成代码高尔夫吧!根据David的出色回答,这是我的:

perl -ane 'print "@F[0,1]\n";'

编辑:一个真正的高尔夫提交看起来更像这样(剃掉五招):

perl -ape '$_="@F[0,1]
"'

但这个问题的目的不太可读.:-P



3> Chris Jester..:

这是一个通用的解决方案(如果我们离开代码高尔夫一点).

#!/usr/bin/perl -n
chop;                     # strip newline (in case next line doesn't strip it)
s/#.*//;                  # strip comments
next unless /\S/;         # don't process line if it has nothing (left)
@fields = (split)[0,1];   # split line, and get wanted fields
print join(' ', @fields), "\n";

通常split按空格分割.如果那不是您想要的(例如,解析/etc/passwd),您可以将分隔符作为正则表达式传递:

@fields = (split /:/)[0,2,4..6];

当然,如果你正在解析冒号分隔的文件,那么这些文件没有注释也很有可能你也不必剥离它们.



4> David Nehme..:

一个简单的单线程

perl -nae 'print "$F[0] $F[1]\n";'

你可以改变分隔符 -F

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有