grep +与正则expression式完全匹配的IP地址

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

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

 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 

正则表达式不好比较数字,我会用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 

注意:您必须逃脱. 意味着一个文字的时期。

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

 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