grep的+精确匹配的IP地址与正则表达式(grep + match exactly IP addr

2019-10-17 18:10发布

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

Answer 1:

你需要使用一些高级工具将文本转换为正则表达式,所以你还不如用这一点。

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


Answer 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

注意:您必须逃脱. 是指文字句点。



Answer 3:

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



Answer 4:

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



文章来源: grep + match exactly IP address with Regular Expression