os.system() 中的引号匹配


os.system('''awk '$1 == "RULE" && $8 !=0{print $2, $8}' "{}/ABC*XYZ*" | sort -u >>error_file'''.format(path))

使用终端执行此命令时,该命令工作正常,但使用 os.system(( 这是打印错误

KeyError: 'print $2, $8'

你应该明白format做什么。两个例子:

'a{}c'.format('b')
>>> abc
'a{b}c'format(b='b')
>>> abc

如果有一个空括号对,格式将逐个传递参数。其他明智的格式将按名称传递参数。

现在你想使用 format 来填充命令,但实际上你的命令有两个括号 paris,所以它会尝试填充所有这些---显式的,它会失败。

你应该写'{{print $2, $8}}',如果你只想使用括号文本而不是填充其他内容。所以你的代码应该是:

os.system('''awk '$1 == "RULE" && $8 !=0{{print $2, $8}}' "{}/ABCXYZ" | sort -u >>error_file'''.format(path))

我对awk了解更多,所以我不确定它可以按照您想要的方式工作,但至少我很确定您在这里不需要反斜杠。它等于

os.system('''awk '$1 == "RULE" && $8 !=0{{print $2, $8}}' "{}/ABCXYZ" | sort -u >>error_file'''.format(path))

而且,一个有趣的观点,我认为你不需要,但只是在这里展示:

os.system('''awk '$1 == "RULE" && $8 !=0{print $2, $8}' "{}/ABCXYZ" | sort -u >>error_file'''.format(path, **{'print $2, $8': '{print $2, $8}'}))

虽然你不能用print $2, $8作为参数名称,但实际上你可以把它作为字典键传递:(