【问题标题】:How to use single quotes inside awk statement that is surrounded by single quotes?如何在被单引号包围的 awk 语句中使用单引号?
【发布时间】:2012-07-09 23:31:20
【问题描述】:

我在实现脚本所需的这个 awk 语句时遇到问题:

rsh fooDNS '
    ...

    BROADCAST_IP_ADDRESS=$(/usr/sbin/ifconfig $IF_NAME | grep broadcast |  awk '{print \$6}')
    ...
'

这里的问题是上面的语句包含在一个用单引号括起来的 rsh 命令中。因此,bash 无法解释 {print $6} 周围的单引号,这给我带来了很多问题。到目前为止,我还无法确定如何解决这个问题。

【问题讨论】:

  • 与问题无关,但不需要grep。 ifconfig ... | awk "/broadcast/{ print $6}"

标签: linux bash awk hp-ux


【解决方案1】:

你不能嵌套单引号,但你可以结束单引号字符串,包括一个转义的单引号,然后重新输入引号。试试这个:

rsh fooDNS '
    ...

    BROADCAST_IP_ADDRESS=$(/usr/sbin/ifconfig $IF_NAME | grep broadcast |  awk '\''{print $6}'\'')
    ...
'

尽管如此,这种引用疯狂很快就会变得丑陋。如果可能的话,我建议使用 scp/rcp/ftp 将一个普通的 bash 脚本复制到远程,然后运行它。如果做不到这一点,我认为如果您不需要向脚本的标准输入提供任何内容,则可以使用这样的技巧:

cat script_file | rsh fooDNS bash

(如果您的脚本是普通的-sh-兼容,并且远程端当然没有 bash,则使用 rsh fooDNS /bin/sh。)

作为另一种选择,如果您的 sn-p 很短,您可以在此处使用文档:

rsh fooDNS sh <<'EOF'
    ...
    BROADCAST_IP_ADDRESS=$(/usr/sbin/ifconfig $IF_NAME | grep broadcast |  awk '{print $6}')
    ...
EOF

【讨论】:

  • 非常感谢。我被困了几个小时。顺便说一句,上述答案只有在从 $6 后面删除反斜杠时才有效,但除此之外,这真的很有帮助。谢谢。
【解决方案2】:

每次将嵌入的单引号替换为序列'\''。理论上,你可以这样做:

rsh fooDNS '
    ...
    BROADCAST_IP_ADDRESS=$(/usr/sbin/ifconfig $IF_NAME | grep broadcast |
    awk '\''{print $6}'\'')
    ...
'

第一个'结束当前的单引号字符串; \' 序列添加单引号;最后的 ' 重新启动一个新的(但连续的)单引号字符串。所以,这不会引入空格或任何东西。

另一方面,最好避免这样做。当重新解释字符串时,它很容易引起问题。在处理远程 shell 时,情况更是如此。

【讨论】:

    【解决方案3】:

    我通常在手动进行深度嵌套时使用双引号,或者自动混合使用双引号和单引号。

    如果您手动执行此操作,则使用反斜杠转义嵌套的双引号、撇号和美元符号可能更简单,并避免执行超过一两层的深度。

    有时,我不会手动嵌套引号,而是使用: http://stromberg.dnsalias.org/~strombrg/bashquote.html 它可以自动以指数方式用双引号包裹一个字符串。它混合使用双引号和单引号。

    EG。从代码的最小测试:

    dstromberg@zareason-limbo6000a ~/src/home-svn/bashquote/trunk $ ./bashquote.py
    unquoted: 'This is a test'
    repetition 0: ''"'"'This is a test'"'"''
    repetition 1: ''"'"''"'"'"'"'"'"'"'"'This is a test'"'"'"'"'"'"'"'"''"'"''
    repetition 2: ''"'"''"'"'"'"'"'"'"'"''"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'This is a test'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"''"'"'"'"'"'"'"'"''"'"''
    Final version: ''"'"''"'"'"'"'"'"'"'"''"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'This is a test'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"''"'"'"'"'"'"'"'"''"'"''
    ''"'"''"'"'"'"'"'"'"'"''"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'This is a test'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"''"'"'"'"'"'"'"'"''"'"''
    

    这对于跳过 3 个 ssh 并在 4 日执行应该是不错的。

    【讨论】:

    • 希望人们不要被逼到如此愚蠢的地步。不过,如果工具做对了,它看起来还是很有用的。
    【解决方案4】:

    对于 AWK 脚本,我将变量设置为等效的八进制数。

    但在像你这样的情况下,我会使用双引号,并确保像你所做的那样转义可能被 shell 解释的所有内容,例如美元符号。

    我不会使用rsh,因为它不安全。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-16
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      相关资源
      最近更新 更多