我有一个unix(aix)命令,其中包含一个小的awk脚本。它的工作原理在这里......
ps -eaf | awk 'ARGIND == 1 {$pids[$0] = 1} ARGIND > 1 {if ($2 in pids) printf("%s\n",$0)}' /home/richard/myFile.flg -
当我使用ssh从另一个框运行此命令时,它不起作用。
ssh myuser@myOtherBox ps -eaf | awk 'ARGIND == 1 {$pids[$0] = 1} ARGIND > 1 {if ($2 in pids) printf("%s\n",$0)}' /home/richard/myFile.flg -
我已经知道我需要引用awk脚本并在awk命令中转义一些字符,但我无法正确获取转义。
有人请帮助我引用脚本的awk部分并转义所需内容。
感谢
答案 0 :(得分:4)
执行
时会发生什么ssh myuser@myOtherBox ps -eaf | ...
是ps -eaf
在另一个框上运行,并返回输出;然后ssh
将它接收的输出写入自己的stdout,该stdout通过命令...
(本地)重定向;在这种情况下,awk命令。
不幸的是,(我假设)/home/richard/myFile.flg
位于远程mache而不是本地计算机上,因此awk命令失败。
要使整个事物在远程计算机上运行,您需要将其作为单个参数提供;一种不需要太多引用的方法就是使用here-doc:
ssh myuser@myOtherBox "$(cat<<"END"
ps -eaf |
awk 'ARGIND == 1 {pids[$0] = 1}
ARGIND > 1 {if ($2 in pids) printf("%s\n",$0)}' \
/home/richard/myFile.flg -
END
)"
请注意,printf("%s\n",$0)
实际上只是编写print
的一种复杂方式,因此您可以相当简化远程命令。但是你仍然需要处理awk命令中的单引号:
ssh myuser@myOtherBox '
ps -eaf |
awk '"'"'ARGIND == 1 {pids[$0] = 1; next}
$2 in pids {print}'"'"' \
/home/richard/myFile.flg -'
要了解'"'"'
,您需要将其分解为:
' close '-quoted string
"'" A (quoted) '
' open another '-quoted string
答案 1 :(得分:1)
在这种情况下你需要双重逃避,这应该有效:
ssh myuser@myOtherBox "ps -eaf | awk \"ARGIND == 1 {\\\$pids[\\\$0] = 1} ARGIND > 1 {if (\\\$2 in pids) printf(\\\"%s\n\\\",\\\$0)}\" /home/richard/myFile.flg -"
答案 2 :(得分:0)
如果您可以使用bash&#39; STRING&#39;语法,然后事情仍然很好 可读;在这种情况下,只需要逃避单引号和 反斜线:
$'ps -eaf |
awk \'
ARGIND == 1 {$pids[$0] = 1}
ARGIND > 1 {if ($2 in pids) printf("%s\\n",$0)}\' /home/richard/myFile.flg -'