逃脱awk命令

时间:2015-12-22 23:54:00

标签: unix awk aix

我有一个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部分并转义所需内容。

感谢

3 个答案:

答案 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 -'