我有一个用“:”分隔的文件
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: $!";
答案 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";
}}