如何在Bash输出中提取特定IP地址(含带端口场景)
如何从Bash输出中提取IP地址(含独立IP和带端口的IP)
我来帮你搞定这两种场景下的IP提取问题,用Bash里的常用工具就能轻松解决~
一、提取独立存在的IP地址
如果你的输出里IP是单独出现的(没有附带端口或其他后缀),用grep配合正则表达式就能直接提取。
常用命令:
grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' 你的输入文件 # 或者通过管道处理命令输出,比如: 你的Bash命令 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'
参数说明:
-E:启用扩展正则表达式,让我们能更简洁地写IP的匹配规则-o:只输出匹配到的部分(而不是整行)
例子:
假设你的输出是这样的:
$ ping -c 1 google.com | grep PING
PING google.com (142.250.190.142) 56(84) bytes of data.
运行命令:
ping -c 1 google.com | grep PING | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'
输出结果就是:142.250.190.142
二、提取带端口号的IP地址(仅保留IP部分)
如果输出里的IP是类似192.168.0.100:8080这种带端口的格式,我们有两种常用方法提取纯IP:
方法1:先用grep匹配,再用sed去掉端口
你的Bash命令 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}:[0-9]+' | sed 's/:[0-9]*$//'
- 第一步
grep匹配带端口的完整字符串,第二步sed把末尾的:端口号部分删掉。
方法2:直接用grep匹配IP部分(更简单)
其实前面的IP正则也能匹配带端口字符串里的IP部分,因为正则只匹配四段数字,后面的端口会被自动忽略:
你的Bash命令 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'
例子:
假设你的输出是这样的:
$ ss -tuln | grep LISTEN
tcp LISTEN 0 128 10.0.0.5:3000 0.0.0.0:*
运行命令:
ss -tuln | grep LISTEN | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'
输出结果就是:10.0.0.5
额外技巧:匹配有效的IP地址(过滤无效值)
上面的正则会匹配像999.999.999.999这种无效IP,如果要确保提取的是合法的0-255范围内的IP,可以用更精确的正则:
grep -Eo '((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]?)'
这个正则会严格匹配每段0-255的数字,避免提取无效的IP格式。
内容的提问来源于stack exchange,提问作者1995
相关产品推荐
相关产品推荐

