我在Mac OS上工作
我试图通过netstat
grep所有与我的PC通信的外地地址。所以我写了一个bash脚本如下:
#!/bin/bash
regex_ip="(2[0-4][0-9]|25[0-5]|1[0-9][0-9]|[1-9]?[0-9])(\.(2[0-4][0-9]|25[0-5]|1[0-9][0-9]|[1-9]?[0-9])){3}"
netstat -an | awk -v regex="$regex_ip" 'match($5, regex){print $1 " " $5 " " $6}'
令我惊讶的是,脚本的结果包含了一些我不理解的内容:
tcp4 209.58.188.104.443 ESTABLISHED
tcp4 209.58.188.104.443 ESTABLISHED
tcp4 209.58.188.104.443 ESTABLISHED
tcp4 17.252.156.146.5223 ESTABLISHED
tcp4 209.58.188.104.443 ESTABLISHED
tcp4 121.51.140.151.443 ESTABLISHED
tcp4 192.168.1.107.63705 ESTABLISHED
udp4 203.208.43.65.443
8ed9d67a97a634bf 8ed9d67aa16641d7 0
8ed9d67a93d2faf7 8ed9d67a9568389f 0
8ed9d67a93d3100f 8ed9d67a954e2a8f 0
8ed9d67a93d3006f 8ed9d67a94062fe7 0
8ed9d67a93d30f47 8ed9d67a94062b0f 0
8ed9d67a93d30e7f 8ed9d67a94062eef 0
8ed9d67a93d30137 8ed9d67a940321d7 0
8ed9d67a93d30db7 8ed9d67a9401ff6f 0
8ed9d67a93d30c27 8ed9d67a93f8e7a7 0
8ed9d67a93d30b5f 8ed9d67a93d2a89f 0
如你所见,我有两部分:ip4地址和UDP图表(如果我是正确的话)。
我不明白为什么$regex_ip
无法正常工作:8ed9d67a9568389f
之类的内容如何匹配正则表达式?我需要的只是那些ip4地址。
答案 0 :(得分:1)
在OSX上,您可以添加-p tcp
作为协议,仅获取tcp4
输出:
{ netstat -an -p tcp; netstat -an -p udp; } |
awk -v regex="$regex_ip" '$5 ~ regex{print $1, $5, $6}'
同样@triplee在你的正则表达式中提到单引号并使用双重转义点。所以使用:
regex_ip='(2[0-4][0-9]|25[0-5]|1[0-9][0-9]|[1-9]?[0-9])(\\.(2[0-4][0-9]|25[0-5]|1[0-9][0-9]|[1-9]?[0-9])){3}'
答案 1 :(得分:1)
优化 awk
解决方案:
regex_ip="(2[0-4][0-9]|25[0-5]|1[0-9][0-9]|[1-9]?[0-9])"
netstat -an | awk -v re="$regex_ip" '$5~"^"re"(\\."re"){3}"{ print $1,$5,$6 }'
答案 2 :(得分:0)
在双引号中,你需要加倍反斜杠来嵌入一个字面。对于正则表达式,使用单引号通常是一个更好的主意,正是出于这个原因。