【问题标题】:awk command doesn't work under /bin/sh -cawk 命令在 /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。

标签: python awk


【解决方案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 前的双反斜杠)

【讨论】:

    猜你喜欢
    • 2021-11-13
    • 2019-04-19
    • 2013-05-16
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多