如何提取在Perl中也有TXT记录的A记录?

时间:2010-01-25 19:54:57

标签: perl

我有这样的数据:

uniqname1.foo.bar IN A 10.0.0.1  
uniqname1.foo.bar IN TXT "abcdefg"  
uniqname2.foo.bar IN A 10.0.0.2  
uniqname2.foo.bar IN TXT "xyz"  
uniqname3.foo.bar IN A 10.0.0.3  
uniqname4.foo.bar IN A 10.0.0.4`

你得到了图片,并非每个主机都有TXT,有些人会这样做。 我试图获得一个正则表达式,它将为具有TXT的主机打印3个值,在这种情况下输出将是:

uniqname1.foo.bar 10.0.0.1 abcdefg  
uniqname2.foo.bar 10.0.0.2 xyz`

4 个答案:

答案 0 :(得分:2)

我不会为此使用正则表达式。您可能会遇到一些文件,这些文件的顺序不同,完全搞砸了您的模式。而是创建一个数据结构来保存记录,选择具有TXT条目的记录,并从TXT条目中查找A数据。虽然正则表达式既有趣又强大,但哈希有时甚至更强大:

use 5.010;

while( <DATA> ) {
    chomp;
    # maybe another normalization step here
    my( $name, undef, $type, $data ) = split;

    $records{$type}{$name} = $data;
    }

foreach my $txt_record ( keys %{ $records{'TXT'} } ) {
    my $txt_data = $records{'TXT'}{$txt_record};
    my $a_data   = $records{'A'}{$txt_record};

    say join ' ', $txt_record, $a_data, $txt_data;
    }

__DATA__
uniqname1.foo.bar IN A 10.0.0.1
uniqname1.foo.bar IN TXT "abcdefg"
uniqname2.foo.bar IN A 10.0.0.2
uniqname2.foo.bar IN TXT "xyz"
uniqname3.foo.bar IN A 10.0.0.3
uniqname4.foo.bar IN A 10.0.0.4

答案 1 :(得分:0)

在perl:

while ($s =~ m/^([\w.]+) IN A ([\d.]+)(?:\r|\r\n|\n)$1 IN TXT "([\w+])"/m) {
    print "$1 $2 $3\n";
}

你的数据blob是$ s。

我没有测试过,但上面已经接近了。

答案 2 :(得分:0)

您真的需要解析文本区域数据吗?为什么不使用Net::DNS以编程方式查询该数据?

例如:

use Net::DNS;
my $res = Net::DNS::Resolver->new;
my $txtquery = $res->query("example.com", "TXT");
my $aquery = $res->query("example.com", "A");

if ($txtquery and $aquery) {
    ($txtquery->answer)[0]->print;
} else {
    print "query failed: ", $res->errorstring, "\n";
}

答案 3 :(得分:0)

另一种方式

#!/usr/bin/perl
while (<>) {
    @F = split ' ', $_ ;
    if ($F[2] eq 'A') {
        $a{$F[0]} = $a{$F[0]} . ' ' . $F[$#F];
    }
    if ($F[2] eq 'TXT') {
        print "$F[0] $a{$F[0]} $F[$#F] \n";
    }
}

输出

$ perl test.pl file
uniqname1.foo.bar  10.0.0.1 "abcdefg"
uniqname2.foo.bar  10.0.0.2 "xyz"