awk 命令在 /bin/sh -c 下不起作用

Posted

技术标签:

【中文标题】awk 命令在 /bin/sh -c 下不起作用【英文标题】:awk command doesn't work under /bin/sh -c 【发布时间】:2021-10-17 12:03:22 【问题描述】:

我正在使用这个命令:

码头工人ps | awk '$2 ~ /^selenium/ 打印 $1 '

在 shell 中运行良好,但在使用 sh -c 运行时它不起作用,我收到此错误:

awk: cmd. line:1:  ~ /^selenium/  print  
awk: cmd. line:1:  ^ syntax error

我想要的完整命令是 Python 脚本的一部分:

os.popen("nsenter -t 1 -m -u -n -i sh -c \"docker ps | awk -F/ '\''$2 ~ /^selenium/  print $1 '\''\"")

这可能是一些逃避问题,但我无法解决任何问题。

【问题讨论】:

不确定nsenter在这里做了什么,但是你可以通过在启动容器时使用docker run --name selenium来避免很多类似的恶作剧;那么docker ps --filter name=selenium -q 应该直接给你一个容器ID。 【参考方案1】:

那里有几个引起问题的引用级别。如果您从外部使用 Python 三引号('''""")开始,您可以减少需要执行的转义量。

这让我们明白了:

os.popen('''nsenter -t 1 -m -u -n -i sh -c "docker ps | awk -F/ '\$2 ~ /^selenium/  print \$1 '"''')

我们仍然需要转义$,否则它们会被外壳(os.popen 调用以运行命令的那个)转义。

我对你的awk 命令中的-F/ 有点怀疑,但我假设你已经对此进行了测试并确认它会变成你想要的输出。


通过使用默认不调用/bin/shsubprocess 模块,您可以进一步减少转义(以必须自己标记命令行为代价):

import subprocess
subprocess.check_output([
    'nsenter', '-t', '1', '-m', '-u', '-n', '-i', 
    'sh', '-c', "docker ps | awk  -F/ '$2 ~ /^selenium/  print $1 '"
])

【讨论】:

如果您不方便自己操作,可以使用shlex.split() 为您标记命令。 (不过,我不完全确定它对于非平凡的嵌套引用是否会正确运行。)【参考方案2】:

你有没有试过:... awk -F/ '\\$2 ~ /^s...

($2 前的双反斜杠)

【讨论】:

以上是关于awk 命令在 /bin/sh -c 下不起作用的主要内容,如果未能解决你的问题,请参考以下文章

“java -version”在命令提示符下不起作用

在Dockerfile中使用和“Source”的Run指令不起作用?

为啥 os.path.join() 在这种情况下不起作用?

Visual Studio 2012 tf 命令在注销状态下不起作用

awk不分配变量并使用$ 0代替

为啥 sudo 用户时 pssh 命令不起作用?