表达式 awk、python 中的无效字符

3 python bash awk subprocess

我有一个如下所示的命令:

ps v -p 2585 | awk '{if ($9 != "%MEM") {print $9}}'
Run Code Online (Sandbox Code Playgroud)

现在这在 bash 中运行得很好,它只需要你给它的 pid 的内存部分。不过我现在正在尝试用 python 实现它,但遇到了一些问题。这是我在 python 中的内容

cmd1 = ['ps', 'v', '-p', pid]
cmd2 = ['awk', '\'{if ($9 != "%MEM") {print $9}}\'']
Run Code Online (Sandbox Code Playgroud)

现在运行它们...

runcmd1 = subprocess.Popen(cmd1, stdout=subprocess.PIPE)
runcmd2 = subprocess.Popen(cmd2, stdin=runcmd1.stdout, stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

awk: '{if (\$9 != "%MEM") {print \$9}}'
awk: ^ invalid char ''' in expression
Run Code Online (Sandbox Code Playgroud)

我用它来打印命令的样子... sys.stdout.write(' '.join(cmd1)+' '+'|'+' '+' '.join(cmd2)+'\n ')

它给出了:

ps v -p 1073 | awk '{if ($9 != "%MEM") {print $9}}'
Run Code Online (Sandbox Code Playgroud)

我认为这和实际运行的 bash 命令没有区别。有人可以帮忙吗?

Use*_*ess 6

当您通过 popen 运行 awk 命令时,您不需要保护 awk 命令免受 shell 的影响(参数已经分成一个列表,因此您的空格不会受到影响)。

cmd2 = ['awk', '{if ($9 != "%MEM") {print $9}}']
Run Code Online (Sandbox Code Playgroud)

会工作得很好。


注释以供将来参考

Python 有一些编写字符串的好方法,可以在您确实需要它的情况下避免像您在此处尝试做的那样转义:

cmd2 = ['awk', '{if ($9 != "%MEM") {print $9}}']
Run Code Online (Sandbox Code Playgroud)