如何通过Bash命令过滤IP地址并实现单IP仅保留一条记录
Bash命令实现IP去重(保留每个唯一IP一条记录)
方案1:保留每个IP首次出现的条目
直接在原有命令后追加awk处理逻辑,按IP部分去重,只输出首次出现的完整行:
netstat -tapen | grep :631 | awk '{print $5}' | grep -v '0.0.0.0' | awk -F: '!seen[$1]++'
原理:用冒号分割提取IP部分($1),通过数组seen记录已出现的IP,只有当IP第一次出现时才打印整行。
方案2:保留每个IP最后出现的条目
如果需要保留每个IP最后出现的那条记录,用awk缓存每个IP的最新行,最后统一输出:
netstat -tapen | grep :631 | awk '{print $5}' | grep -v '0.0.0.0' | awk -F: '{line[$1]=$0} END{for(ip in line) print line[ip]}'
原理:遍历所有行时,用数组line持续更新每个IP对应的最新行,遍历结束后输出所有IP的最终缓存行。
高效简化版(合并管道步骤)
把多个grep/awk步骤合并,减少管道开销:
netstat -tapen | awk '/:631/ && $5 !~ /0.0.0.0/ {split($5, ip_port, ":"); if(!seen[ip_port[1]]++) print $5}'
原理:在单个awk进程里完成匹配631端口、排除0.0.0.0、拆分IP和端口、去重打印的全部逻辑,执行效率更高。
内容的提问来源于stack exchange,提问作者osiris73
相关产品推荐
相关产品推荐

