2

我想仅使用正则表达式从 IP 地址(v4)获取第三个数字。

这里有很多ip

172.23。34 .159
172.23。34 .51
211.234。202 .246
147.6。41 .120
172.23。34 .171
10.225。149 .118
172.23。34 .64

那可能吗?

4

3 回答 3

1

这应该至少适用于

\b\d{1,3}\.\d{1,3}\.\K\d{1,3}(?=\.\d{1,3}\b)

或者,如果您想要更强大的东西:

\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.\K(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?=\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b)

你可以试试

$ re='\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.\K(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?=\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b)'
$
$ perl -lne 'print $& if /'"$re"'/' file.txt
34
34
202
41
34
149
34
$ 
$ grep -oP "$re" file.txt
34
34
202
41
34
149
34
于 2012-11-07T02:42:17.247 回答
1

当涉及到正则表达式时,您对数据了解得越多,您就越有能力解析/修改它。例如,如果您有一个数组或一个您已经知道仅包含 IP 地址的受信任文件,那么简单(在 Perl 中):

    my @ips = qw(172.23.34.159
                 172.23.34.51
                 211.234.202.246
                 147.6.41.120
                 172.23.34.171
                 10.225.149.118
                 172.23.34.64);
    for (@ips) {
        print "$1\n" if $_ =~ /(?:\d+\.){2}(\d+)\.\d+/;
    }

或者

    while (<>) {
        print $1\n" if $_ =~ /^\s*(?:\d+\.){2}(\d+)\.\d+\s*$/;
    }

就足够了。而如果您从外部来源或具有许多不同数据类型的文件收集数据,则需要更加严格(在这种情况下,sputnick已经提供了适当严格的示例)

于 2012-11-07T08:46:13.510 回答
1

在 BRE 中:

/^[0-9]\{1,3\}\.[0-9]\{1,3\}\.\([0-9]\{1,3\}\)\.[0-9]\{1,3\}$/

或在 ERE 中:

/^[0-9]+\.[0-9]+\.([0-9]+)\.[0-9]+$/

如果您sed在旧操作系统上使用类似的东西,您可能会被限制为 BRE。请注意,并非所有正则表达式实现都包含反向引用,因此您可能会更早地使用正则表达式以外的其他方法来获取此信息。例如,在awk

[ghoti@pc ~]$ echo "10.11.12.13" | awk -F. '{print $3}'
12

或者只是纯粹的 bash:

[ghoti@pc ~]$ addr="10.11.12.13"
[ghoti@pc ~]$ addr=${addr#*.*.}
[ghoti@pc ~]$ addr=${addr%.*}
[ghoti@pc ~]$ echo $addr
12
于 2012-11-07T03:12:12.047 回答