Bash 中的正则表达式来验证 IP 地址

Ale*_*hin 5 bash regular-expression

在我的 Python 脚本中,我有一个用于在文件中搜索 IP 地址(如 0.0.0.0-255.255.255.255)的正则表达式,它看起来像这样:

[1-2]{0,1}[0-9]{0,1}[0-9]{1}\.[1-2]{0,1}[0-9]{0,1}[0-9]{1}\.[1-2]{0,1}[0-9]{0,1}[0-9]{1}\.[1-2]{0,1}[0-9]{0,1}[0-9]{1}
Run Code Online (Sandbox Code Playgroud)

现在我需要在 Bash 脚本中使用相同的内容。所以我把它改成这样:

[1-2]\{0,1\}[0-9]\{0,1\}[0-9]\{1\}\.[1-2]\{0,1\}[0-9]\{0,1\}[0-9]\{1\}\.[1-2]\{0,1\}[0-9]\{0,1\}[0-9]\{1\}\.[1-2]\{0,1\}[0-9]\{0,1\}[0-9]\{1\}
Run Code Online (Sandbox Code Playgroud)

几乎可以正常工作,但由于某种原因,它过滤了“1000.0.0”、“2323.23.23.2323”等地址。为什么呢。

小智 8

试图缩短正则表达式,结果如下:

#!/bin/bash

rx='([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])'

for ip in 08.08.08.08 3.3.3.3 11.11.11.11 \
      111.123.11.99 \
      222.2.3.4 999.88.9.9 \
      255.255.255.255 255.0.3.3 0.256.0.222; do

   if [[ $ip =~ ^$rx\.$rx\.$rx\.$rx$ ]]; then
      echo "valid:     "$ip
   else
      echo "not valid: "$ip
   fi
done
Run Code Online (Sandbox Code Playgroud)


gle*_*man 5

我认为这应该涵盖它

$ octet="(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])"
Run Code Online (Sandbox Code Playgroud)

或者避免左侧出现零:

$ octet="(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])"  
Run Code Online (Sandbox Code Playgroud)

然后您可以使用$octet

$ ip4="^$octet\\.$octet\\.$octet\\.$octet$"
$ echo $ip4
^(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])$
$ [[ 123.234.12.34 =~ $ip4 ]] && echo y || echo n
y
$ [[ 123.234.12.345 =~ $ip4 ]] && echo y || echo n
n
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 4

regexppython使用的是来自egrep70 年代命令的扩展正则表达式语法(尽管该{...}部分是后来添加的,实际上是在grep之前添加的egrep)。

POSIX在 90 年代整合了grepandegrep命令(egrep现在是),并对运算符进行了标准化(这在早期是不可用的)。grep -E{x,y}egrep

所以现在,您应该能够grep -E 'that-regexp'与所有现代grep实现一起使用。

请注意,您的正则表达式将允许 299.299.299.299 并且{1}s 是多余的。{0,1}可以缩短为?.

请注意,grep查找与正则表达式匹配的,即包含与任意位置的正则表达式匹配的字符串的行。使用^$进行锚定,或使用-x选项 到grep