我想仅使用正则表达式从 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
那可能吗?
我想仅使用正则表达式从 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
那可能吗?
\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
当涉及到正则表达式时,您对数据了解得越多,您就越有能力解析/修改它。例如,如果您有一个数组或一个您已经知道仅包含 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已经提供了适当严格的示例)
在 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