2017-02-28 28 views
1

我正在编写Perl脚本,但我没有得到它的一部分。对文本文件中的字符串不区分大小写的grep

有一个带有主机名的文本文件,每行一个。

我需要搜索第二个文件的主机名(黑名单),以查看从第一个主机名读取的主机名。要成为圣人,搜索应该不区分大小写。

我的第一种方法是使用Perl grep,但我阅读了它,它似乎不太适用于我所需要的。所以我想过使用shell grep

据我所知,它可以执行system,qx,反引号和open

我决定使用system,这样我就可以得到grep的退出状态代码,并在if语句中使用它来完成脚本的其余工作。我的代码看起来像这样(与grep测试脚本):

use strict; 
use warnings; 

my $blacklist_server = "de9899svc"; 
my $server = undef; 
my $exit_value = undef; 

open(SERVERLISTE,"/home/ansible/serverscan/scan_results/serverliste_22.02.17.txt") or die "$!"; 

OUTER: while (<SERVERLISTE>) { 
    $server = $_; 

    system("grep -i '\$server' /home/ansible/serverscan/black.list"); 
    $exit_value = $? >> 8; 
    print "$exit_value\n"; 
} 

close SERVERLISTE; 

的问题是,$exit_value始终为1,无论主机名是否匹配。所以有人可以告诉我我错过了什么:)

+0

'if(grep {/ $ server/i} ''请试试这样。 – ssr1012

回答

0
grep -iF -f blacklist serverlist 

上述命令打印在serverlist匹配任何行的是,在blacklist情况下不区分大小写的所有行。

如果你想从serverlistblacklist使用匹配任何行删除行:

grep -viF -f blacklist serverlist 

可以使用回抢里面的perl输出蜱。

$not_blacklisted=`grep -viF -f blacklist serverlist`; 

更多可读命令:

grep --ignore-case --fixed-strings --file=blacklist serverlist 

grep --invert-match --ignore-case --fixed-strings --file=blacklist serverlist 

我试图与GNU grep的2.25。

+0

就这样试了一下: – audioslave

4

更好的问题是要问如何让Perl的grep做你想做的。编写Perl代码几乎总是一条更好的途径,而不是创建一个全新的shell进程来做这样简单的事情。我确信这是可能的,但我不能纠正你的错误观念,如果你不解释

问题是,你不使用chomp从您从任一文件读取的记录中删除行结尾。在shell命令执行过程中把一个换行符将终止在该点的命令,所以它看起来像grep -i '$server

我将建立黑名单服务器的哈希值,并检查它的每一个服务器列表

的代码看起来像这样。它使用的情况下折叠fc符来比较大小写不敏感,所以需要该功能启用

use strict; 
use warnings 'all'; 
use feature qw/ fc say /; 

use constant { 
    SERVER_LISTE => '/home/ansible/serverscan/scan_results/serverliste_22.02.17.txt', 
    BLACK_LISTE => '/home/ansible/serverscan/black.list', 
}; 

my %blacklist = do { 
    open my $fh, '<', BLACK_LISTE or die $!; 
    my @blacklist = <$fh>; 
    chomp @blacklist; 
    map { fc $_ => 1 } @blacklist; 
}; 

open my $server_liste, '<', SERVER_LISTE or die $!; 

while (my $server = <$server_liste>) { 

    chomp $server; 

    say "server $server is blacklisted" if $blacklist{ fc $server }; 
} 
+0

@Sobrique:对不起,谢谢你指出。重复的键只是为了测试,我忘了把它们拿出来。该结构只是一个匿名散列,所以后面的同一个键会覆盖任何前面的键。 – Borodin

+0

看起来不错。非常感谢你!背景是,我正在导入Ansible-Tower数据库中的服务器列表。服务器来自扫描脚本,用于查找给定子网中的Linux服务器。但也有一些主机,如网络交换机,设备等,这些主机被认为是Linux主机,但无法与Ansible一起管理。所以我正在用这台主机建立一个黑名单,导入脚本需要忽略这个主机。如果你对如何实现这一目标有了更好的了解,我很高兴听到它:) – audioslave

+0

“BLACK_LISTE =>'black.list',”顺便说一下,是多余的:) – audioslave

0

我看到2个问题,在您的代码:$服务器包含一个尾随“\ n”。你应该吃它。在调用grep时,你在$之前有一个\。

相关问题