我有一个包含 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
代码如下grep
perl 代码中的正则表达式与上面的解决方案非常相似
答案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
在终端上输入命令。