我有这样的数据:
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`
答案 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"