这对我没有意义。我定义了5个变量:
a='a'
b='b'
c='c'
d='d'
e='e'
然后我尝试使用这些变量构建命令:
command = "for i in \`python {0}_getSyslogs.py {1} {2} {3}\`\ndo\ngunzip -c {3}/\$i | egrep -i '{4}' >> " .format(a,b,c,d,e)
这可以按预期工作,生成命令:
"for i in \\`python a_getSyslogs.py b c d\\`\ndo\ngunzip -c d/\\$i | egrep -i 'e' >> "
如果我在字符串中添加一个组件(即“test”),我得到的是什么,整个事情就会分崩离析,因为没有更多的替换:
command = "for i in \`python {0}_getSyslogs.py {1} {2} {3}\`\ndo\ngunzip -c {3}/\$i | egrep -i '{4}' >> " + "test" .format(a,b,c,d,e)
结果命令如下:
"for i in \\`python {0}_getSyslogs.py {1} {2} {3}\\`\ndo\ngunzip -c {3}/\\$i | egrep -i '{4}' >> test"
这可能是一个“看不见穿过树林的森林”的问题,但我一直在尝试各种不同的组合,没有任何作品。
我在CentOS上运行python 2.7.10:
内容sys.version '2.7.10(默认,2017年10月6日,22:29:07)\ n [GCC 4.2.1兼容的Apple LLVM 9.0.0(clang-900.0.31)]'
我做错了什么?
答案 0 :(得分:2)
您只在“test”字符串上应用format
函数。
尝试:
command = "for i in \`python {0}_getSyslogs.py {1} {2} {3}\`\ndo\ngunzip -c {3}/\$i | egrep -i '{4}' >> test" .format(a,b,c,d,e)
答案 1 :(得分:1)
试试这个:(command+"test").format(a,b,c,d,e)
,即将其放在括号中。您当前的方法仅使用"test"
答案 2 :(得分:0)
为什么不呢,
"... >> test".format(a,b,c,d,e)
而不是
"... >> " + "test".format(a,b,c,d,e)
.format
仅适用于一个string
对象,您将其应用于"test"
。
如果确实想要连接两个字符串,首先将它们存储在变量中,然后执行您需要执行的操作。
str1 = "example{} " + "test"
str1.format('3')
# example3 test
答案 3 :(得分:0)
如果可能,请不要尝试填写字符串模板来构建命令,因为您不太可能正确引用引号。相反,尽可能使用subprocess
模块在Python中执行此操作。
from subprocess import Popen, call, PIPE
def processFile(name, pattern, output):
p = Popen(["gunzip", "-c", name], stdout=PIPE)
call(["egrep", "-i", pattern], stdin=p1.stdout, stdout=output)
with open("test", "w") as fh:
p = Popen(["python", "{0}_getSyslogs.py".format(a), b, c, d], stdout=PIPE)
for x in p.stdout:
x = x.strip()
processFile(os.path.join(d, x), e, fh)