2015-04-07 64 views
-1

我试图从用户PC检索默认网关。他们将运行OSX或Linux。正则表达式与Sed和存储输出在变量python

到目前为止,我使用的是route -n get default | grep gateway这给我输出,如gateway 192.168.1.254我想只需要“192.168.1.254”省略网关字。我试过使用route -n get default | grep gateway | sed "[0-9]+但这似乎不起作用。

我有两个问题:

1)为什么不是正则表达式工作?

2)我可以使用什么模块来检索命令的输出以存储变量,而不仅仅是像subprocess.call()这样的返回码?

+0

你确定这个'route -n get default | grep gateway'命令返回'gateway 192.168.1.254'输出? –

回答

1

你可以使用相同的grep本身。

route -n get default | grep 'gateway' | grep -o '[0-9.]\+' 

OR

你可以使用awk

route -n get default | awk '/gateway/{print $2}' 

在Python中,你可以使用subprocess.check_output功能shell命令的输出存储到一个特定的Python变量。

result = subprocess.check_output("""route -n get default | awk '/gateway/{print $2}'""", shell=True) 
+0

我的两条线路仍在使用'gateway:192.168.1.254'而不是'192.168.1.254'。 图片:http://iforce.co.nz/i/n2dxwhxx.zvq.png –

+0

您需要在grep中使用'-o'参数才能打印匹配项。检查我的更新.. –

0

你为什么不使用:

var = os.popen(shell cmd).read() 

保存输出数据。

然后你只需要:

print var 

要检查和调试输出。

0

在Python中完成大部分工作;

In [1]: import subprocess 

In [2]: data = subprocess.check_output(['route', '-n', 'get', 'default']) 

In [3]: data = data.decode('utf-8').splitlines() 

In [4]: for ln in data: 
    ...:  if 'gateway' in ln: 
    ...:   gw = ln.split()[1] 
    ...:   break 
    ...:  

In [5]: gw 
Out[5]: '192.168.178.1' 

我使用Python 3.4在这里,因此decode()In[3]