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/sh
的subprocess
模块,您可以进一步减少转义(以必须自己标记命令行为代价):
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 下不起作用的主要内容,如果未能解决你的问题,请参考以下文章
在Dockerfile中使用和“Source”的Run指令不起作用?