如何检查文件中的IP地址有效性?

geo*_*rea 0 perl file

我在一个文本文件中有一个信息报告,我想将它们导出为CSV格式,并且仅导出为IPv4格式的那些行(按第一列)。我如何在Perl中做到这一点?

10.10.10.1      10.10.11.11    51251    445      2019-03-05 11:59:29.008   29.156     ......
10.10.10.2      10.10.11.22    51234    123      2019-03-05 11:40:29.008   30.156     .A..SF
2001:288:8900:c400:2018:8ce:1ca8:9cb0                  2404:6800:4012:1::200e  62105    443 2019-03-04 23:59:32.458     0.340 17    ......   0        8     4763     1
2001:288:8001:c200:3171:3abcd:28af:7e8f                  2404:6800:4008:c04::bc  50286    443 2019-03-04 23:59:32.471     0.000 6     .A....   0        1       61     1
Run Code Online (Sandbox Code Playgroud)

我只想获取如下IPv4格式的行,

10.10.10.1      10.10.11.11    51251    445      2019-03-05 11:59:29.008   29.156     ......
10.10.10.2      10.10.11.22    51234    123      2019-03-05 11:40:29.008   30.156     .A..SF
Run Code Online (Sandbox Code Playgroud)

我的代码

open my $fh, '<', 'in.txt';
open my $fo, '>', 'out.csv';
while (<$fh>) {
    next if ($. == 1);
    s/^\s+//;
    my $text = (join ',', (split /\s+/, $_))."\n";
        print $fo $text;
    }
Run Code Online (Sandbox Code Playgroud)

如何测试第一列是否为IPv4格式?

cho*_*oba 7

Regexp :: Common包含您需要的正则表达式:

use feature qw{ say };
use Regexp::Common qw( net );

# ...
my @columns = split;
next unless $columns[0] =~ /$RE{net}{IPv4}/;
say {$fo} join ',', @columns;
Run Code Online (Sandbox Code Playgroud)