bash:如何grep ip4地址

时间:2018-01-19 18:21:32

标签: regex bash awk ip

我在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地址。

netstat -an的输出:
enter image description here enter image description here enter image description here

3 个答案:

答案 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)

在双引号中,你需要加倍反斜杠来嵌入一个字面。对于正则表达式,使用单引号通常是一个更好的主意,正是出于这个原因。