如何在Python中正确地将双引号传递给awk子进程?

如何在Python中正确地将双引号传递给awk子进程?,python,shell,awk,escaping,Python,Shell,Awk,Escaping,我试图运行简单的awkshell命令并捕获其输出(使用python2)。 以下是我尝试做的: import subprocess as sb shell = ["awk '!/<tag>/ {print \"\\"\"$1\"\\"\", \"\\"\"$2\"\\"\"}' test.txt"] p = sb.check_output(shell, shell=True) print p 我希望使用awk获得以下输出并将其存储到变量中: "a" "b" "a" "c" "d"

我试图运行简单的awkshell命令并捕获其输出(使用python2)。 以下是我尝试做的:

import subprocess as sb

shell = ["awk '!/<tag>/ {print \"\\"\"$1\"\\"\", \"\\"\"$2\"\\"\"}' test.txt"]
p = sb.check_output(shell, shell=True)
print p
我希望使用awk获得以下输出并将其存储到变量中:

"a" "b"
"a" "c"
"d" "d"
然而,我显然缺乏正确处理双引号的知识。我试着用几下后挡板逃离他们,但都没用。
如何正确地转义双引号以使上面的示例正常工作?

当您使用
shell=True
但传递一个列表时,您要求Python将字符串列表合并在一起,就像它们是单独的参数一样。这意味着它可以在你所做的任何引用的基础上,进行自己的引用,希望壳牌能够正确地扭转局面。这将是一场噩梦。如果要使用
shell=True
,只需传递一个字符串即可

但这就引出了一个问题:首先为什么要使用
shell=True
。如果不使用此选项,您可以只传递一个参数列表,而不必引用任何参数来保护它们不受shell的影响。更容易编写,更容易调试,更高效,更安全地引导。除非你真的需要shell功能,或者你有一个命令行,你努力工作,不想花时间分解成单独的参数,否则永远不要使用shell


实际上,我不确定您要在这里运行什么
awk
命令。如果你在
$1
$2
周围给它双引号,它只会打印一个文本
“$1”“$2”
,因为这就是引号对awk的含义。也许你想要这样的东西

awk '!/<tag>/ {print "\""$1"\"", "\""$2"\""}' test.txt
awk'!//{打印“\”“$1”\”、“\”“$2”\”“}”test.txt
在这种情况下:

subprocess.check_output(['awk', r'!/<tag>/ {print "\""$1"\"", "\""$2"\""}', 
                         'test.txt'])
子流程。检查\u输出(['awk',r'!/{print“\”“$1”\”,“\”“$2”\”“}),
'test.txt'])
(注意,我使用了一个原始字符串,这样我就可以按字面意思传递
“\”
,而不必反斜杠。)


但是这仍然不能提供您想要的输出,因为
$1
将是
a,
,所以
“\”“$1”\”“
将是
”a,“

您使用的是哪一版本的python?test.txt可能与之类似?这里要做的最明显的事情是不要使用
shell=True
,不要尝试构建引用引号的命令行,等等。如果您没有使用任何shell功能,为什么要让您的生活变得更困难(代码效率更低、安全性更低、调试更困难)?显然是python2,因为
print p
;)
subprocess.check_output(['awk', r'!/<tag>/ {print "\""$1"\"", "\""$2"\""}', 
                         'test.txt'])