Python-意外标记`';

Python-意外标记`';,python,sh,Python,Sh,我试图修复下面的错误很长时间,但无法找到触发此错误的原因。我尝试用直接日志文件名替换文件,并且day1给出了文件的总字数 >>> 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

我试图修复下面的错误很长时间,但无法找到触发此错误的原因。我尝试用直接日志文件名替换
文件
,并且
day1
给出了文件的总字数

>>> 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()

这确实是
shell
而不是
python
的问题。语法错误来自
sh

sh: -c: line 1: syntax error
正如您所观察到的,删除空白可以解决您的问题

发生的情况是,第一个
os.popen()
的输出作为Python字符串分配给
文件
,该字符串包含一个终止换行符。 这是因为命令的输出包含一个终止换行符

因此
文件
将是字符串
“foo access.0\n”
或类似的内容

这意味着发送到第二个
os.popen()
的命令是

sudo cat foo-access.0
| wc -l
sudo cat foo-access.0 | wc -l
这是无效的shell语法(通常,管道,
|
,不能开始一行)

删除空格将删除尾随的换行符,因此发送到第二个
os.popen()
的命令是

sudo cat foo-access.0
| wc -l
sudo cat foo-access.0 | wc -l
这很好


正如其他人所指出的,这个脚本在其他方面也很糟糕。

您的引号是错误的。` | `如果只是调用
ls
grep
awk
,你甚至不应该使用python。。。创建一个真正的shell或者用python本机实现。我看不出我在代码中提到过这个“|”。我在@umutto
print“sudo cat%s | wc-l”%x
中遗漏了什么吗?请检查您试图在那里执行的确切命令。它的语法无效。谢谢你的建议