【问题标题】:Escape awk command转义 awk 命令
【发布时间】:2016-03-29 08:15:08
【问题描述】:

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

谢谢

【问题讨论】:

  • “它不起作用” - 请详细说明。
  • $pids[$0] 应该是 pids[$0]。祝你好运。
  • @shellter:这是真的,我修正了我的答案。但是杂散的美元符号不会影响观察到的脚本行为。
  • 是的,同意,您的回答是脚本正在本地执行。我只是没有时间写那个。祝大家好运。

标签: unix awk aix


【解决方案1】:

执行时会发生什么

ssh myuser@myOtherBox ps -eaf | ...

ps -eaf在另一个盒子上运行,并返回输出; ssh 然后将接收到的输出写入自己的标准输出,该标准输出(本地)通过命令... 重定向;在这种情况下,是一个 awk 命令。

不幸的是,(我假设)/home/richard/myFile.flg 在远程机器上而不是本地机器上,所以 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

【讨论】:

    【解决方案2】:

    在这种情况下您需要双重转义,这应该可以工作:

    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 -"
    

    【讨论】:

    • 谢谢你的双重转义在这里工作并且是最简单的解决方案
    【解决方案3】:

    如果你可以使用 bash 的 $'STRING' 语法,那么事情就不会发生了 可读;在这种情况下,只需转义单引号和 反斜杠:

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

    【讨论】:

      猜你喜欢
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多