2016-09-07 3 views
0

grepを使用して特定の配列に存在する要素のみを検索する方法はありますか?例えば :出力に存在する配列のGrep要素

my @IPS ={"10.20.30","12.13.14","30.40.50"}; 

my $cmd = `netstat -Aa | grep -c IPS[0] OR IPS[1] OR IPS[2] ` 

print "$cmd"; 

Iは、netstatコマンドの出力に存在するIPSの数(配列で見出さのみ)を返すようにCMDたいです。 "|"または条件を使用できますが、配列の要素の数がわからないことを前提としています。

答えて

2

のように最初にそれを検証することができます。

my @IPS = ("10.20.30","12.13.14","30.40.50"); 

そして私はとすることを記述します:私はあなたがおそらく望んでいたと思います

my @IPS = qw(10.20.30 12.13.14 30.40.50); 

私は私が使用することができます知っている「|」または状態が、私は数を知らないことを前提としてい配列内の要素

私は全く問題はないと思います。

# Need quotemeta() to escape the dots 
my $IP_str = join '|', map { quotemeta $_ } @IPS; 
my $IP_re = qr/$IP_str/; 

# Keep as much of the processing as possible in Perl-space 
my @found = grep { /$IP_str/ } `netstat -Aa`; 
say scalar @found; 

正規表現の代わりに、@IPSをハッシュにすることができます。

my %IP = map { $_ => 1 } @IPS; 
my @found = grep { $IP{$_} } `netstat -Aa`; 
say scalar @found; 

更新:実は、その最後の例は動作しません。ハッシュと照合する前に、netstat出力からIPアドレスを抽出する必要があります。誰かにそれを広げてもらうためにそこに残しておきました。

+0

詳細な答えをいただきありがとうございます。私は正規表現の代替を試み、配列には何も含まれていません。この場合、どのようにIPSをIPSアレイに挿入するかは重要ですか?なぜなら私はコマンドを使ってそれを行うからです:my @IPS = '$ cmd | tr "" "\ n" '; chomp @IPS – user3586606

+0

私の更新を見てください。その代替バージョンは動作しません。配列がどのように設定されているかは関係ありませんが、要素に** IPアドレスだけが**含まれていることを確認する必要があります。たとえば、改行文字も含めておくのは簡単です。それはうまくいきません。 –

+1

あなたは非常に多くのものを外部プログラムに渡すのを止める必要があります。 Perlは完全に使える 'tr /.../.../ '演算子を持っています:-) –

0

これを実行するために迅速かつ汚い方法は、perlで$"変数を利用することにより、次のとおりです。

my @IPS =("10.20.30","12.13.14","30.40.50"); 
local $"='|'; 
my $cmd = `netstat -Aa | grep '@IPS' | wc -l` 
print "$cmd"; 

アイデアがいくつか引用符の内側に補間されたときに、配列変数がどのように$"コントロールが表示されていることです。したがって、$"='|'と言うと、で区切られた要素の連結として@IPS配列が補間されます。 注::あなたは@IPSのソースを信頼する場合にのみこれを使用してください。コード内に自分で入力した場合。信頼できない外部ソースからのものであれば、上記のトリックは危険です。

編集@IPSは信頼できないソースから来ない場合は、あなたがあなたの@IPS配列は、あなたはそれが含まれていると思うものを含んでいないので、

/^[\d.]+$/ or die "Invalid IP address" for @IPS; 
+0

こんにちは、これは私が知らなかった非常に素晴らしいトリックです。しかし、これは私のために働いていない、私は出力にIPSがありますが、これを行うときに値0を取得します。この行 "netstat -Aa | grep '@IPS' | wc -l'"についてあなたは確かですか? – user3586606

+0

まあ、私は自分で入力するのではありませんが、外部のソースから取得するので、アレイのIPSの数を知ることができません。あなたがこれを行うために知っている他の方法? – user3586606

+0

答えを更新しました。 – redneb

関連する問題