2017-05-31 61 views
-1

我試圖通過Python子AWK:1:意外的字符「」」錯誤

cat /etc/passwd | awk -F':' '{print $1}' 

我所做的是通過運行兩個子進程運行的命令來運行這個命令。

1st:將取出結果即。 貓/ etc/passwd中

第二:第一的輸出將被饋送作爲輸入提供給第二AWK -F ':' '{打印$ 1}'

下面是代碼:

def executeCommand(self, command, filtercommand): 
    cmdout = subp.Popen(command, stdout=subp.PIPE) 
    filtered = subp.Popen(filtercommand, stdin=cmdout.stdout, stdout=subp.PIPE) 
    output, err = filtered.communicate() 
    if filtered.returncode is 0: 
     logging.info("Result success,status code %d", filtered.returncode) 
     return output 
    else: 
     logging.exception("ErrorCode:%d %s", filtered.returncode, output) 
     return False 

命令= [ '須藤', '貓', '/ etc/shadow的']

filtercommand = [ 'AWK', 「-F ':'」, 「 '{打印$ 1}'」,' |」, 'uniq的']

錯誤:

awk: 1: unexpected character ''' error 

如何創建傳遞給函數的filercommand列表:

filtercommand=["awk","-F\':\'", "\'{print $1}\'", '|', 'uniq'] 
+0

'''{print $ 1}'「'中不需要單引號。只需刪除它們。而且,'「-F」'和'「':'」'必須是兩個獨立的參數,後者也不需要單引號。 – DyZ

+0

嘗試沒有單引號拋出'awk:can not open | (沒有這樣的文件或目錄)' –

+1

'''不是命令行參數,它是一個shell重定向。你不能以這種方式使用它。您必須重新連接'awk'的標準輸出到'uniq'的標準輸出,就像您將'cat'的標準輸出重新連接到'awk'的標準輸出一樣。順便說一句,你可以做'sudo awk -F':''{print $ 1}'/ etc/shadow',而不用'cat'。 – DyZ

回答

0

您可以使用管道命令直接使用subprocess.Popen並得到輸出和錯誤,因爲這:

import subprocess 

cmd = "cat /etc/passwd | awk -F':' 'NF>2 {print $1}'" 

p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) 
output, err = p.communicate() 

print output 
print err 

但是請注意,cat是因爲awk在上述管道命令完全無用可以在文件上直接操作這個:

cmd = "awk -F':' 'NF>2 {print $1}' /etc/passwd"