我的目标是,以匹配三个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正则表达式”,以匹配三个字节,而四个八位字节必须是有效的?
你需要使用一些高级工具将文本转换为正则表达式,所以你还不如用这一点。
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
核心模块)。
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