如何从一组字符串中选择并打印 IP 地址?

如何从一组字符串中选择并打印 IP 地址?

我有一个包含 IP 地址的句子。例如,

This sentence contains an ip number 1.2.3.4 and port number 50, i want to print the IP address only.

从上面的句子中,我只想打印 IP 地址。我该怎么做?我听说可以使用sed

答案1

这是可能的,但并不优雅:

echo 'This sentence contains an ip number 1.2.3.4 and port number 50, i want to print the IP address only.' \
| sed 's/.*\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/'

[0-9]匹配任何数字,\{1,3\}表示可以重复 1 到 3 次。\.匹配一个点。整个 IP 由括号捕获\(...\),其前后的内容由 匹配.*,即重复零次或多次的任何内容。然后,整个匹配字符串(即整行)将替换为第一个匹配组的内容。

您可以通过引入变量使其更具可读性:

n='[0-9]\{1,3\}'
... | sed "s/.*\($n\.$n\.$n\.$n\).*/\1/"

如果未找到 IP,它会打印整个字符串。它也不会检查无效 IP,如 256.512.999.666。

答案2

这是一个grep解决方案:

echo "$sentence" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'
  • -o仅打印匹配的部分
  • -E切换到扩展正则表达式
  • 该模式匹配每个数字 ( [0-9]) 一次或多次 ( +) 然后是一个点 ( \.) 然后再次匹配数字...

这是另一个解决方案perl

echo "$sentence" | perl -l -ne '/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ && print $&'
  • -l指定行终止符(换行符)
  • -n循环遍历给出的输入echo(可以是多行)
  • -e代码如下
  • grepperl 代码中的正则表达式与上面的解决方案非常相似

答案3

使用此命令grep

grep -Eo '[0-9.]+ ' file

或者甚至更好:

grep -oP '\d+\.\d+\.\d+\.\d+' file

或者

grep -Eo "([0-9]{1,3}[\.]){3}[0-9]{1,3}" file

答案4

我会在 Python 3 解释器中这样做。它不仅可以抓取这种格式的文本111.111.111.111,还可以检查其是否有效。

>>> import re
>>> import ipaddress
>>> text = "This sentence contains an ip number 1.2.3.4 and 111.111.111.111 451.976.897.786 port number 50, i want to print the IP address only."
>>> foo = re.findall(r'(?<!\S)(?:\d{1,3}\.){3}\d{1,3}(?!\S)', text)
>>> foo
['1.2.3.4', '111.111.111.111', '451.976.897.786']
>>> for i in foo:
...     try:
...         ipaddress.ip_address(i)
...     except:
...         pass
... 
IPv4Address('1.2.3.4')
IPv4Address('111.111.111.111')

要获取 python 3 解释器,请python3在终端上输入命令。

相关内容