2017-03-13 50 views
-3

私は長い間、以下のエラーを修正しようとしていますが、なぜこのエラーがトリガーされているのかわかりません。私はfileを直接ログファイル名に置き換えようとしました。day1はファイルの総単語数を与えています。Python - 予期しないトークン `| '

>>> import os 
>>> ports =["1080"] 
>>> os.chdir("/var/logs") 
>>> for i in range(0, len(ports)): 
...  file = os.popen("ls -al |grep -i access|grep -w %s.0|awk \'{print $9}\'" %ports[i]).read() 
...  day1 = os.popen("sudo cat %s|wc -l" %file).read() 
... 
sh: -c: line 1: syntax error near unexpected token `|' 
sh: -c: line 1: `|wc -l' 

本当にありがとうございます。

回答:

問題は空白のためです。空白を削除すると問題が解決しました。

file = os.popen("ls -al |grep -i access|grep -w %s.0|awk \'{print $9}\'" %ports[i]).read().strip() 
+0

引用符が間違っています。 '| ' '|'にする必要があります – umutto

+0

'ls'、' grep'、 'awk'だけを呼び出すのであれば、Pythonを使うべきではありません。実際のシェルを作るか、Pythonでネイティブに行います。 –

+0

私はこのことについて言及していません '| 'コードで私はここに何も足りないでしょうか? – Premchand

答えて

2

これは本当にshellないpythonの問題です。構文エラーがshから来ている:あなたが観察したよう

sh: -c: line 1: syntax error 

は、空白を削除すると、あなたの問題を修正します。

最初のos.popen()の出力がfileにPython文字列として割り当てられ、その文字列に終端改行が含まれているとします。 これは、コマンドの出力に終端改行が含まれているためです。

したがってfileは、文字列"foo-access.0\n"または類似の文字列になります。第os.popen()に送信されたコマンドが有効なシェルの構文はない

sudo cat foo-access.0 
| wc -l 

であることを意味する

(一般的に、パイプ、|は、行を開始することができません)。空白を削除

は末尾の改行を除去するので、第二os.popen()に送信されたコマンドは、すべて良好である

sudo cat foo-access.0 | wc -l 

あります。

他にも触れたように、このスクリプトは他の方法でも貧弱です。

関連する問題