使用Perl匹配特定单词后面的所有单词

时间:2015-07-23 10:08:41

标签: regex perl

我使用的是Perl,需要将http://www.malwaredomainlist.com/hostslist/hosts.txt中的所有域名都放到一个平面文件中。

我认为最简单的方法是使用正则表达式,但我无法理解如何构建表达式。

我的代码到目前为止:     #!的/ usr / bin中/ perl的     使用LWP :: Simple;

$url = 'http://www.malwaredomainlist.com/hostslist/hosts.txt';

$content = get $url;
open(my $fh, '>', '/home/jay/feed.txt');
#logic here
}
close $fh;

我不确定是否应循环每一行并在其上执行表达式,或者我是否应该将整个文件作为字符串并使用它。

6 个答案:

答案 0 :(得分:0)

除非您有特殊需要,否则逐行迭代是前进的方向。否则你只是不必要地占用内存。

然而,当您提取网址时,它有点学术性 - 我建议首先将其提取到文件中并不是坏事,因此您可以重新处理它而不需要要重新获取。

给出源数据样本:

 for ( split ( "\n", $content ) ) {
      next unless m/^\d/; #skip lines that don't start with a digit. 
      my ( $IP, $hostname ) = split;
      my $domainname = $hostname =~ s/^\w+\.//r;
      print $domainname,"\n";
 }

但是,这并不完全适用于您的列表,因为在该列表中,您混合使用了主机名和域名,实际上并不容易区分它们。

毕竟,&#t>'最后可能是.com,也可能是.org.it

答案 1 :(得分:0)

127.0.0.1\s+(.*)

应该可以正常使用全局修饰符。

Demo

答案 2 :(得分:0)

除非在本地保存列表文件是必需的(在这种情况下,您可能最好只使用wgetcurl),因此无需将其保存在外部文件中进行处理线由行。

您可以改为打开文件句柄到字符串本身。

在下面的脚本中,无论您是为字符串还是文件名提供引用,extract_hosts都会起作用:

#!/usr/bin/env perl

use strict;
use warnings;

use Carp qw( croak );
use LWP::Simple qw( get );

my $url = 'http://www.malwaredomainlist.com/hostslist/hosts.txt';

my $malware_hosts = get $url;
unless (defined $malware_hosts) {
    die "Failed to get content from '$url'\n";
}

my $hosts = extract_hosts(\$malware_hosts);
print "$_\n" for @$hosts;

sub extract_hosts {
    my $src = shift;

    open my $fh, '<', $src
        or croak "Failed to open '$src' for reading: $!";

    my @hosts;

    while (my $entry = <$fh>) {
        next unless $entry =~ /\S/;
        next if $entry =~ /^#/;

        my (undef, $host) = split ' ', $entry;
        push @hosts, $host;
    }

    close $fh
        or croak "Failed to close '$src': $!";

    \@hosts;
}

这将为您提供主机列表。

答案 3 :(得分:0)

从给定文件中获取主机名的代码。

use LWP::Simple;
my $url = 'http://www.malwaredomainlist.com/hostslist/hosts.txt';

my $content = get $url;
my @server_names = split(/127\.0\.0\.1\s*/, $content);

open(my $fh, '>', '/home/jay/feed.txt');
print $fh "@server_names";
close $fh;

答案 4 :(得分:0)

该页面只是一个text/plain文档,所以我想我只是将页面复制并粘贴到我的编辑器中并删除不需要的信息。但是,如果您更喜欢Perl程序,那么这就是必要的。它使用LWP::Simple::get来获取文本页面和正则表达式来搜索以数字和点开头的行,返回每个

的第二个字段
use strict;
use warnings;
use feature 'say';

use LWP::Simple qw/ get /;

my $url = 'http://www.malwaredomainlist.com/hostslist/hosts.txt';
say for get($url) =~ /^[\d.]+\s+(\S+)/gam;

或作为单行

perl -MLWP::Simple=get -E"say for get(shift) =~ /^[\d.]+\s+(\S+)/gam" http://www.malwaredomainlist.com/hostslist/hosts.txt

答案 5 :(得分:-1)

这是另一种实现。它使用HTML :: Tiny,它是核心的一部分,因此您无需安装任何东西。

 use HTTP::Tiny;

 my $response = HTTP::Tiny->new->get('http://www.malwaredomainlist.com/hostslist/hosts.txt');

 die "Failed!\n" unless $response->{success};
 my @content;

 for my $line ( split ( "\n", $response->{content} ) ){
     next if ( $line =~ /^#|^$/);
     push @content, ((split ( " ", $line ))[1]);
  }

  print Dumper (\@content);