grep +与正则表达式完全匹配IP地址

时间:2013-02-22 11:27:45

标签: linux perl grep solaris ksh

我的目标是准确地将IP地址与三个字节匹配,而四个IP八位字节必须是有效的八位字节 - 在< 0到255>之间。

例如,我在文件中有以下IP

$ more file    
192.9.200.10
192.9.200.100
192.9.200.1555
192.9.200.1
192.9.200.aaa
192.9.200.@
192.9.200.:
192.9.200
192.9.200.

我需要匹配前三个八位字节 - 192.9.200,而四个八位字节必须有效(0-255)

所以最后 - 期望结果应该是:

192.9.200.10
192.9.200.100
192.9.200.1

基本语法应如下所示:

IP_ADDRESS_THREE_OCTETS=192.9.200
cat file | grep -x $IP_ADDRESS_THREE_OCTETS.[  grep‏ Regular Expression syntax ]

请建议如何写出正确的" grep regular Expression"在四个八位字节中为了匹配三个八位字节,而四个八位字节必须有效?

4 个答案:

答案 0 :(得分:3)

您需要使用一些高级工具将文本转换为正则表达式模式,因此您也可以使用它。

perl -ne'
    BEGIN { $base = shift(@ARGV); }
    print if /^\Q$base\E\.([0-9]+)$/ && 0 <= $1 && $1 <= 255;
' "$IP_ADDRESS_THREE_OCTETS" file

如果对基数进行硬编码是可以接受的,则减少为:

perl -ne'print if /^192\.9\.200\.([0-9]+)$/ && 0 <= $1 && $1 <= 255' file

这两个片段也接受来自STDIN的输入。


获取完整的IP地址:

perl -ne'
    BEGIN { $ip = shift(@ARGV); }
    print if /^\Q$ip\E$/;
' 1.2.3.4 file

perl -nle'
    BEGIN { $ip = shift(@ARGV); }
    print if $_ eq $ip;
' 1.2.3.4 file

答案 1 :(得分:2)

Regexp不适合比较数字,我会用awk执行此操作:

$ awk -F. '$1==192 && $2==9 && $3==200 && $4>=0 && $4<=255 && NF==4' file
192.9.200.10
192.9.200.100
192.9.200.1

如果您真的想使用grep,则需要-E标志来扩展正则表达式或使用egrep,因为您需要更改:

$ grep -Ex '192\.9\.200\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])' file
192.9.200.10
192.9.200.100
192.9.200.1

$ IP=192\.9\.200\.

$ grep -Ex "$IP(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])" file

注意:您必须将.转义为文字句点。

答案 2 :(得分:0)

如果您确实想确定您所拥有的是有效的IPv4地址,您可以随时查看inet_aton()Socket核心模块的一部分)的返回值。

答案 3 :(得分:0)

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])$'

此表达式不会将IP地址与前导0匹配。例如,它将不匹配192.168.1.01

此表达式与超过4个八位字节的IP地址不匹配。例如,它将不匹配192.168.1.2.3