上一篇 下一篇 分享链接 返回 返回顶部

在Linux服务器中如何从文件中grep获取IP地址

发布人:Minchunlin 发布时间:2021-03-09 10:07 阅读量:3120

在Linux系统服务器中,你可以使用grep的正则表达式从文件中提取IP地址。grep命令有-E(extended regex)选项,允许它将一个模式解释为扩展的正则表达式。

IPv4地址的格式是一个32位的数字地址,每次以8位为一组(称为八位组),每个八位组之间用点分开。每个八位组的范围可以是0-255。

你可以创建一个正则表达式来查找4个由1-3位数字组成的块,并以点号隔开,就像这样。

grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' ips.txt

这个命令对于大多数目的来说都是好的,但是如果有一个无效的IP地址,比如265.168.1.2(记住一个八位数不能高于255),它仍然会找到它。

我们必须扩展这个正则表达式,告诉它忽略256或更高的数字。下面是一个只提取有效IP地址的正则表达式的例子。

$ 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])$' ips.txt

上面的工作做得很好,但它仍然有问题。它不会找到带前导零的 IP 地址,也不会找到八位数中唯一数字为 0 的 IP 地址。例如,这个正则表达式不会匹配10.0.0.5。

为了找到一个只能提取有效IP地址的正则表达式,我们必须花大力气验证模式中的每个八位数。下面是一个例子。

$ grep "([^.]|^)([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])([^.]|$)" ips.txt

即使是上面的内容也不是没有缺陷的。

在IPv4和IPv6中,去掉地址中的前导零是一个行业标准。但这是表示IPv4地址的标准方式,并不意味着每个人都会这样做。

例如,你可以用三个0来表示一个充满零的八位数。

10.000.000.5 = 10.0.0.5

这两个地址在网络上都能正常工作,但即使是ping也会去掉前面的0。

$ ping 10.000.000.5

有一个由Red Hat的一些人建立的小工具,叫做ipcalc,它最初是用来计算主机的IP信息的,但也可以用来验证IP地址。它最初是用来计算主机的IP信息的,但也可以用来进行IP地址验证。果然,这个工具也会把和IP地址前导零的称为无效IP地址。

$ ipcalc -c 10.000.000.5

正如你所看到的,使用grep和正则表达式从文件中提取一个IP地址是相当容易的。但要确保匹配的模式是一个有效的IP地址就不那么容易了。

目录结构
全文