You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下Shell脚本IP过滤正则表达式修复问题求助

问题排查与解决方案

核心问题根源

Shell脚本默认使用基础正则表达式(BRE),而JavaScript用的是ECMAScript正则,两者语法存在关键差异:

  • BRE中,分组()、或运算符|、量词{n}必须转义(写成\(、\|、\{n\})才能生效;
  • ECMAScript正则中这些元字符无需转义,直接可用。

如果直接把JS的正则放到Shell工具(如grep/sed)里,既不转义也不启用扩展正则,就会导致匹配失效。

解决方案

1. 明确需求对应的正则逻辑

要匹配各段均在2~254之间的IP,数字范围的正则需覆盖以下场景:

  • 2-9:[2-9]
  • 10-99:[1-9][0-9]
  • 100-249:1[0-9]{2}|2[0-4][0-9]
  • 250-254:25[0-4]

组合后,单段的正则为:(25[0-4]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[2-9])

2. Shell中使用扩展正则实现

用grep -E或sed -E启用扩展正则(ERE),即可直接使用类似JS的语法:

场景1:过滤所有段均在2~254的IP

# 从ifconfig输出中提取合法IP
ifconfig | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | grep -E '^(25[0-4]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[2-9])\.(25[0-4]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[2-9])\.(25[0-4]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[2-9])\.(25[0-4]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[2-9])$'

场景2:仅过滤最后一段在2~254的IP(匹配你的示例需求)

# 测试示例
echo -e "192.168.18.255\n192.168.18.195\n10.0.0.1\n10.0.0.254" | grep -E '^([0-9]{1,3}\.){3}(25[0-4]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[2-9])$'

输出结果:

192.168.18.195
10.0.0.254

3. 兼容基础正则的写法(不推荐,仅作参考)

如果必须使用BRE(比如不支持-E选项的旧版本工具),需要转义所有元字符:

echo -e "192.168.18.255\n192.168.18.195" | grep '^\([0-9]\{1,3\}\.\)\{3\}\(25[0-4]\|2[0-4][0-9]\|1[0-9]\{2\}\|[1-9][0-9]\|[2-9]\)$'

内容的提问来源于stack exchange,提问作者xgqfrms

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:53:14