2017-02-28 63 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時,你在$之前有一個\。

相關問題