需要帮助,以了解为什么grep中的此字符串提取IP地址而不是其他字符串

时间:2019-02-09 14:53:03

标签: bash grep ip

以下陈述来自我测试并回答的一项家庭作业问题,但我只是不了解该行的行为方式,我想了解原因。我意识到为什么此表达式很难找到IP地址,但是我不完全理解为什么它的行为方式与之类似,因为问号似乎并没有像预期的那样实际运行0或1次。

“ user @ machine:〜$ grep -E'[01]?[0-9] [0-9]?” “

据我了解,“ [01]?”应该寻找括号中指示的任何数字0-1,而问号告诉grep仅寻找零个或一个实例,并且与“ [0-9]”相似。问题是,此行将打印不限数量的数字,其长度超过3位。我排除了这是由于第三个括号没有继续的问号,因为如果通过管道传送回声或使用充满数字的测试.txt文件,它仍然可以打印无限数量的数字。

上面的例子使我比不知道如何用正确的方式用grep查找IP。因此,我发现了无数示例,例如用于IPv4八位字节的以下表达式:

\。(25 [0-5] \ | 2 [0-4] [0-9] \ | [01] [0-9] [0-9] \ | [0-9] [0- 9])。\

这是否告诉我寻找0-5次之间任何2-5的数字? 0-5对于一个八位位组而言太多位数。它告诉我寻找0到25之间的任何数字吗?同样,对于一个八位位组来说,位数太多了。在这种情况下,\ 2 [0-4] [0-9] \是什么意思?我对这个表达式如何严格地查找介于1-255之间的数字感到困惑?

1 个答案:

答案 0 :(得分:0)

以这种方式查看:x?[0-9]x?匹配包含数字的任何内容,因为两个x:是可选的。您最好将它们排除在外,因为它们根本不会限制比赛。

25[0-5]查找25,后跟0-5范围内的数字。换句话说,该表达式匹配范围在250-255之间的数字。

示例中的完整表达式通过枚举以25、20-24等开头的字符串来查找范围在00-255之间的数字;尽管它不完整,因为它不允许使用一位数字。

表达式匹配单个八位字节(不完全),而不匹配整个IP地址。这是匹配IPv4地址的常用方法:

([3-9][0-9]?|2([0-4][0-9]?|5[0-9]?|[6-9])?|1([0-9][0-9]?)?)(\.([3-9][0-9]?|2([0-4][0-9]?|5[0-9]?|[6-9])?|1([0-9][0-9]?)?){3}

其中方括号表示与一组字符中的单个字符匹配的字符类,最后的花括号{3}表示重复。

某些正则表达式方言(例如POSIX grep)在|\(之前需要反斜杠,但是我使用了扩展符号(例如grep -E和大多数在线正则表达式探索工具),不需要反斜杠。