2015-04-07 65 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]