2017-02-28 8 views
1

私はPerlスクリプトを作成していますが、その一部を取得していません。grepは大文字小文字を区別せずにテキストファイル内の文字列を入力します

ホスト名のテキストファイルが1行に1つあります。

私は最初のものから読み取るホスト名のホスト名(ブラックリスト)を有する第二のファイルを検索する必要があります。 sageにするには、大文字と小文字を区別しないで検索する必要があります。

私の最初のアプローチは、Perl grepを使用していたが、私はそれについて読んで、それは私がそれを必要なもののために非常に使用可能ではないようです。だから私はシェルを使用することを考えたgrep

私が知る限り、system,qx、バッククイック、openで実行できます。

私は、grepの終了ステータスコードを取得し、ifステートメントで使用して、スクリプトが意図している作業の残りを行うことができるように、systemを使用することに決めました。私のコードは、この(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 

上記コマンドプリント鈍感blacklist場合に線のいずれかに一致するserverlist内のすべての行。

あなたはblacklist使用中の任意の行にマッチしserverlistから行削除したい場合は:

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コードを書く方が良いでしょう。私はそれが可能であると確信していますが、あなたが説明していないとあなたの誤解を訂正することはできません

chompのいずれかのファイルから読み込んだレコードから行末を削除しないでください。それはgrep -i '$server

のように、私はブラックリストにサーバのハッシュを構築するだろう、と、リスト内の各サーバに対して

を、それをチェックしに見えるように、シェルコマンドの途中で改行を入れると、その時点でコマンドを終了しますコードは次のようになります。これは、大文字と小文字を区別せずに比較することfcオペレータを折るケースを使用し、私はあなたのコード内の2つの問題を参照

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

いいですね。どうもありがとうございました!バックグラウンドは、私のAnabilities-Towerデータベースにサーバのリストをインポートしているということです。サーバーは、特定のサブネット内のLinuxサーバーを検索するスキャンスクリプトから生成されます。しかし、ネットワークスイッチ、アプライアンスなどのようなホストもLinuxホストとして認識されますが、Ansibleでは管理できません。だから私はこのホストでブラックリストを作成しており、インポートスクリプトはこのホストを無視する必要があります。これを達成する方法についてのより良いアイデアがあるなら、私はそれを聞いて嬉しいです:) – audioslave

+0

"BLACK_LISTE => 'black.list'、"は冗長です、ちなみに – audioslave

0

有効にする機能が必要です:$サーバーは末尾の「\ n」を含んでいます。あなたはそれをchompする必要があります。グレップへの呼び出しでは、あなたは$の前に\を持っています。

関連する問題