2015-12-22 156 views
0

我有一个unix(aix)命令,其中包含一个小awk脚本。它的工作原理,就是这样......Escape 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 [email protected] 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部分,并逃避所需的东西。

感谢

+1

“它不工作” - 阐述PLZ。 –

+0

'$ pids [$ 0]'应该是'pids [$ 0]'。祝你好运。 – shellter

+0

@shellter:这是真的,我解决了我的答案。但流浪的美元符号并不影响观察到的脚本行为。 – rici

回答

1

在这样的情况下,你需要双重转义,这应该工作:

ssh [email protected] "ps -eaf | awk \"ARGIND == 1 {\\\$pids[\\\$0] = 1} ARGIND > 1 {if (\\\$2 in pids) printf(\\\"%s\n\\\",\\\$0)}\" /home/richard/myFile.flg -" 
+0

谢谢你在这里工作的双逃脱,是最简单的解决方案 – Richie

4

当你执行

ssh [email protected] ps -eaf | ... 

ps -eaf已经在另一个盒子运行会发生什么,而返回的输出; ssh然后将它接收到的输出写入它自己的stdout,它通过命令...(本地)重定向;在这种情况下,一个awk命令。

不幸的是,(我认为)/home/richard/myFile.flg在远程mache而不是本地机器上,所以awk命令失败。

为了让整个事情在远程机器上运行,您需要将它作为单个参数提供;这并不需要太多的努力,引用一个方法是使用一个在这里-DOC:

ssh [email protected] "$(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 [email protected] ' 
    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 
0

如果你可以使用bash的$ 'STRING' 的语法,那么事情仍然相当 可读;在这种情况下,一个只有逃避单引号和 反斜线:

$'ps -eaf | 
    awk \' 
    ARGIND == 1 {$pids[$0] = 1} 
    ARGIND > 1 {if ($2 in pids) printf("%s\\n",$0)}\' /home/richard/myFile.flg -'