1

我的目标是用三个八位字节精确匹配 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正则表达式”以匹配三个八位字节,而四个八位字节必须有效?

4

4 回答 4

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
于 2013-02-22T11:36:20.277 回答
2

正则表达式不适合比较数字,我会这样做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

注意:您必须转义.以表示字面句点。

于 2013-02-22T11:34:47.083 回答
2
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])$'

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

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

于 2013-09-02T05:59:04.223 回答
0

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

于 2013-02-23T02:16:26.457 回答