2010-10-24 12:00:49 +0000 2010-10-24 12:00:49 +0000
36
36

我可以使用什么正则表达式来匹配IP地址?

使用下面的grep语法,我想匹配一个文件中的所有IP地址(来自一个ksh脚本)

grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' file

问题是:它也能匹配超过4个八位数的字(IP)。

1.1.1.1.1

192.1.1.1.160

我如何才能匹配 一个_有效的IP和只有4个八位数的IP地址?如果grep不起作用,我也可以用Perl–一行语法解决。

答案 (12)

57
57
57
2010-10-24 13:01:43 +0000

试试这个。

grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/hosts

匹配从0.0.0.0999.999.999.999

的所有表达式 用

grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/hosts

你将只得到IP地址

注: 在solaris上可能egrep就可以了。

10
10
10
2010-10-24 13:50:10 +0000

这个怎么样? -

perl -MRegexp::Common=net -ne '/($RE{net}{IPv4})/ and print "$1\n"' /etc/hosts
```0x1 

0x1&
5
5
5
2012-09-13 08:12:16 +0000
if [` echo $ip | '^((25[0-5]|2[0-4][0-9]|[01]?[1-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[1-9][0-9]?)$' | grep -o "\." | wc -l` -eq 1 ];
then ipv4=true;
else 
ipv4=false;
5
5
5
2012-09-13 08:35:57 +0000

要只找4个八位数的匹配(不包括1.1.1.1.1.1等),可以用这个方法。

grep -P '(?<=[^0-9.]|^)[1-9][0-9]{0,2}(\.([0-9]{0,3})){3}(?=[^0-9.]|$)'

它应该不会检测到非IP地址. 表达式可以更复杂,以验证更多的东西,但这应该适用于大多数情况。它不会匹配前面的0,因为010.1.12.1不是写IP地址的常用方式。

5
5
5
2012-06-26 11:15:04 +0000
-w / --word-regexp

标志为grep,使得它只能在字的边界上进行匹配,这意味着你的匹配必须被空格包围或者在行的开始/结束处开始/结束!

3
3
3
2010-10-24 15:14:58 +0000

有点麻烦,但应该可以。

( X='\([0-9]\{1,2\}\|1[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)' ; grep "\([^\.]\|^\)$X\.$X\.$X\.$X\([^\.]\|$\)" file )
1
1
1
2015-11-17 09:56:08 +0000

长的regex的较短版本:

egrep '([1-2]?[0-9]{0,2}\.){3,3}[1-2]?[0-9]{0,2}'

请根据你的操作系统版本使用grep -E或egrep。

0
0
0
2015-04-17 11:17:29 +0000

在TCL中匹配一个ip地址的正则表达式

设置一个 “192.168.10.25”

if {[regexp
{^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$} $a]} 
{
puts "yes"
}
```。
0
0
0
2016-09-01 09:46:09 +0000

grep -Eo ‘([0-9]{1,3}.?){4}’

例子 : curl http://korben.info/ip | grep “IP visible depuis mon serveur” | grep -Eo ‘([0-9]{1,3}.?){4}’

0
0
0
2013-09-02 05:56:39 +0000

grep -E ‘^(((25[0-5]|2[0-4][0-9]|[1]?[1-9][0-9]?)?){3}(25[0-5]|2[0-4][0-9]|[1]?[1-9]?[0-9])$’

Arnaud B.答案的修改版。

这个表达式将不匹配带前导 0 的 IP 地址,例如,它将不匹配 192.168.1.01 这个表达式将不匹配超过 4 个八位数的 IP 地址,例如,它将不匹配 192.168.1.2.3。

0
0
0
2015-10-29 18:58:11 +0000

我使用egrep "^([0-9]{1,3}\.){3}[0-9]{1,3}" /etc/hosts 来匹配行首的IP地址。它也可以不使用^来在IP地址前留出空白或其他字符。

[0-9]{1,3} --> this matches a number between 1 and 999.
\. --> this is to add the dot.
([0-9]{1,3}\.){3} --> get a number with a dot 3 times.
[0-9]{1,3} --> finally add the fourth number.
-1
-1
-1
2017-02-15 10:02:50 +0000

下面是我在AIX中对ksh和ksh93的工作原理:

ip=

[[$ip == [0-9]@(“”|[0-9])@(“”|[0-9]).[0-9]@(“”|[0-9])@(“”|[0-9]). [0-9]@(“”|[0-9])@(“”|[0-9])]&& echo OK || echo NOK 以上的内容可以进行修改,以便将所提供的IP “过滤 "成任何需要的模式。