【问题标题】:grep + match exactly IP address with Regular Expressiongrep + 使用正则表达式精确匹配 IP 地址
【发布时间】:2013-02-08 00:13:47
【问题描述】:

我的目标是用三个八位字节精确匹配 IP 地址,而四个 IP 八位字节必须是有效八位字节 -

例如,我在文件中有以下 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正则表达式”以匹配三个八位字节,而四个八位字节必须有效?

【问题讨论】:

  • cat file | 是一种浪费。请改用<file,或将file 作为参数传递给grep

标签: linux perl grep solaris ksh


【解决方案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

这两个 sn-ps 也接受来自 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

【讨论】:

  • 嗨,我非常喜欢你对 perl line liner 的回答,尤其是替换反斜杠“\”的“Q 和 E”,但还有一个问题,你能从你的回答中举出另一个例子 - 如何完全匹配四个八位组的IP地址,perl的解决方法是保存选项,在“.”前设置“\”
  • @Eytan,添加了确切的 IP 地址解决方案以按要求回答。
  • @Eytan,顺便说一句,为了便于阅读,我将代码拆分为多行,但如果你将其全部放在一行中,它也可以工作。
【解决方案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

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

【讨论】:

  • \| 提供不带-E 的替代。
【解决方案3】:
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

【讨论】:

  • 这和问题有什么关系?
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2011-08-27
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2011-08-17
    • 2012-05-17
    • 2015-05-05
    • 1970-01-01
    • 2011-03-01
    相关资源
    最近更新 更多