1

对于 bash 集成,我需要从接口检索默认网关。

这是命令 route -n 的输出

Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
0.0.0.0         p.p.p.p         128.0.0.0       UG    0      0        0 tun0
0.0.0.0         x.x.x.x         0.0.0.0         UG    100    0        0 eth0
10.43.0.1       10.43.0.5       255.255.255.255 UGH   0      0        0 tun0
10.43.0.5       0.0.0.0         255.255.255.255 UH    0      0        0 tun0
y.y.y.y         x.x.x.x         255.255.255.255 UGH   0      0        0 eth0
x.x.x.0         0.0.0.0         255.255.255.0   U     0      0        0 eth0
128.0.0.0       10.43.0.5       128.0.0.0       UG    0      0        0 tun0

我尝试为Iface tun0 捕获网关(法语中的Passerelle)。

这个正则表达式正在使用 Rubular:

^[0\.]+\s+([\w\.]+)\s+.*UG.*tun0$

但是这个 shell 命令不起作用(没有输出):

route -n |egrep -oh '^[0\.]+\s+([\w\.]+)\s+.*UG.*tun0$'

请告诉我为什么 ?

4

3 回答 3

2

为什么不直接使用awk,而不是怪诞的正则表达式?就像是:

route -n | grep -e 'UG.*tun0' | awk '{print $2}'

免责声明:我没有测试过这个,所以可能有一个错字......

于 2013-09-28T16:48:26.733 回答
1

尝试这样做(只有一个管道):

route -n | 
    awk -viface=eth0 '{if ($1 == "0.0.0.0" && $8 == iface) {print $2;exit}}'

甚至更好:

ip route |
    awk -viface=eth0 '{
        if ($1 == "default" && $2 == "via" && $5 == iface) {print $3; exit}
    }'
于 2013-09-28T16:51:44.333 回答
0

另一种选择,没有正则表达式和 awk:

route -n | grep -E "ppp0$" | tr -s ' ' | cut -f 2 -d ' '
于 2013-09-28T16:54:45.097 回答