背景
我正在运行一个在多个主机上显示进程的命令。下面是命令:
execAll -m "$HOSTS" 'hostname; ps -ef | grep build | grep -v grep; ipcs | grep 666'
试图
我现在想ipcs | grep 666
将命令的一部分通过管道传递给awk '{print $2}'
然后kill -9
终止所有活动进程。以下是我尝试过的:
execAll -m "$HOSTS" 'hostname; ps -ef | grep build | grep -v grep; ipcs | grep 666 | awk '{print $2}' | xargs kill -9'
但是,awk
需要单引号来运行其参数,并且上面的命令也需要单引号。我得到的错误是Missing }.
,我将其归因于上面的引用问题。
问题
如何awk
在上述情况下成功运行和终止进程?
并不真地。引号只是一个外壳结构,它们告诉外壳不要扩展美元符号并将字符串保持在一个片段中,而不是在空格上打破它。awk 看到的只是 string
{print $2}
,它不知道它是如何生成的。您可以使用双引号和反斜杠转义来实现相同的效果。所有这些都应该是相同的:后两者适合单引号字符串,没有问题。
或者,如果您的 shell 是 Bash 或其他支持 ANSI C 引用的
$'..'
,您可以将外引号更改为$'..'
,然后也使用反斜杠转义单引号:顾名思义,其他 C 风格的转义(例如
\n
,\t
,\"
,\'
,\\
)也可以在其中工作$'..'
。awk 本身并不“需要”单引号。您只需要确保脚本主体包含您希望它包含的内容。如果您转义以下内容,则会找到双引号
$
: