Bash 来自文件的 IP

Bash IP from file

我正在尝试使用以下命令从文本文件中获取 IPv4 地址:

grep -E -o '((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]))' file.txt.

这将显示有效的 IP 地址,但也会显示我不想要的更长的无效 IP 的有效部分。

输入示例:

IP address one is 192.168.1.1, ip 2 is 192.168.1.2.
192.168.1.3  192.168.1.10.1
Output I get:
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.10
Output I want:
192.168.1.1
192.168.1.2
192.168.1.3

您需要排除 IP 之前紧接 <digit>. 和 IP 之后紧接 .<digit> 的所有匹配项。

这就是为什么您需要具有以下正则表达式的 GNU grep

grep -Po '\b(?<!\d\.)(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b(?!\.\d)' file

开头的\b(?<!\d\.)先匹配一个单词边界(意思是不能有字母,数字或者紧靠当前位置左边的_)并且不能有数字还有 . 序列。

末尾的\b(?!\.\d)先匹配一个词边界(这里指的是不能有字母、数字或者紧靠当前位置右边的_)并且必须有那里也没有 . + 数字序列。

看到一个 online grep demo:

s="IP address one is 192.168.1.1, ip 2 is 192.168.1.2.
192.168.1.3  192.168.1.10.1"
grep -Po '\b(?<!\d\.)(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b(?!\.\d)' <<< "$s"

输出:

192.168.1.1
192.168.1.2
192.168.1.3

参见PCRE regex demo