拆分文件中的行并与perl中的主机名进行比较

时间:2015-07-16 09:42:55

标签: perl

我有一个用“:”分隔的文件

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
antbexw:x:59000:80::/usr/var/log:/bin/ksh

每个“:”是一个分隔符,因此目标是提取位置0和位置5以具有:

uucp /var/spool/uucp
operator /root
games /usr/games
antbexw /usr/var/log

然后只打印包含antbexw的行,该行实际上是机器主机名。

我已经实现了读取文件,拆分而不是与机器主机名进行比较,只打印出antbexw行

antbexw /usr/var/log

在这里我的脚本,你能帮助我构建条件只打印我需要的行吗?或提出另一种方法。

#!/usr/bin/perl -w
use strict;
use warnings;
use diagnostics;
use Sys::Hostname;
my $host = hostname;

print "$host\n";

open(my $fh, '<', 'file.txt') or die "cannot open < file.txt: $!";
while (my $line = <$fh>)
 {
my@fields = split(":",$line);
print "=*=*=*=*User=*=*=*=* \n$fields[0] \nDirectory $fields[5]\n";
}  

close($fh) || warn "close failed: $!";

2 个答案:

答案 0 :(得分:2)

要比较字符串,请使用eq operator

if ($fields[0] eq $host) {
    print "=== User ===\n$fields[0]\nDirectory $fields[5]\n";
}

一些不相关的细节:

您已经拥有use warnings,无需在shebang线上指定-w

split的第一个参数是正则表达式(或空格),因此最好不要使用字符串。

如果正确缩进并在标点符号周围添加一些空格(在逗号之后,@之前),您的代码将更具可读性。

答案 1 :(得分:0)

同时我做了一些其他的尝试并得到了这个解决方案:

while (my $line = <$fh>)
{
if($line =~ m/$host/)
{
my@fields = split(":",$line);
print MYFILE"=*=*=*=*SftpUser=* \n$fields[0] \nDirectory $fields[5]\n"; 
}}