寻求awk单命令行逻辑优化:匹配指定IP提取TCP端口及状态
优化后的端口提取命令
直接替换原有脚本中的管道部分,以下是满足需求的完整命令:
declare -a busy_ports=($(grep -v "local_address" --no-filename "/proc/net/tcp" "/proc/net/tcp6" | awk -F ':' '$1 ~ /^(845DA8C0|00000000)$/ {split($2, ps, / /); print ps[1] ps[2]}' | sort -u))
关键逻辑说明
- 限定本地IP匹配:通过
$1 ~ /^(845DA8C0|00000000)$/直接过滤出本地IP为845DA8C0(192.168.93.132)或00000000(0.0.0.0)的行,无需后续额外过滤。 - 精准提取拼接:
- 用
-F ':'将local_address字段(原$2)按冒号分割,$1是本地IP十六进制,$2包含端口十六进制和状态字段(原$4)。 - 用
split($2, ps, / /)把$2按空格拆分,ps[1]是端口部分,ps[2]是状态值,直接拼接输出即可得到00160A这类格式。
- 用
- 高效去重排序:保留原有的
sort -u实现端口+状态组合的去重。
额外提示
如果不需要处理IPv6条目,可以去掉/proc/net/tcp6参数,减少不必要的文件读取;若需适配IPv6的特定IP,只需修改正则中的匹配值即可。
内容的提问来源于stack exchange,提问作者OscarAkaElvis
相关产品推荐
相关产品推荐

