我的目标是准确地将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"在四个八位字节中为了匹配三个八位字节,而四个八位字节必须有效?
答案 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