awk 中的单引号

awk 中的单引号

有人可以解释一下下面的awk命令发生了什么吗?如果没有错误,那么为什么notme没有打印,为什么我没有收到语法错误,那么对于右括号...}需要用引号关闭...}'

$ awk '{print "me "$0 '"notme"} <<<"printme"
me printme

那么我会尝试这个:

$ awk '{print "me "$0 '"\"$(date)"\"} <<<"printme-at "
me printme-at Wed Apr 11 16:41:34 DST 2018

或者

awk '{print '"\"$(date)\""} <<<"run"
Wed Apr 11 16:56:38 DST 2018

正如它所示,这意味着我可以使用 shell 命令替换来完成所有操作。

这是一个错误吗?或者也许是我找不到的特殊状态。

答案1

对于第一个

$ awk '{print "me "$0 '"notme"} <<<"printme"

这里发生的事情是:

  1. 单引号中的部分将awk逐字传递
  2. 下一部分"notme"}由 shell 解析,然后awk作为结果字符串传递给notme}
  3. awk可以看到这个:

    {print "me "$0 notme}
    

    由于awk变量notme没有值,这就是你得到的

对于第二个

$ awk '{print "me "$0 '"\"$(date)"\"} <<<"printme-at "
me printme-at Wed Apr 11 16:41:34 DST 2018

我更倾向于这样写,使用awk变量来携带 的值$(date)

awk -v date="$(date)" '{print "me "$0 date}' <<<"printme-at "
me printme-at Wed Apr 11 13:43:31 BST 2018

您已经问过为什么您的版本中没有语法错误。让我们把它拆开:

# typed at the shell
awk '{print "me "$0 '"\"$(date)"\"} <<<"printme-at "

# prepared for awk
awk '{print "me "$0 "Wed Apr 11 16:41:34 DST 2018"}' <<<"printme-at "

# seen by awk
{print "me "$0 "Wed Apr 11 16:41:34 DST 2018"}

双引号字符串在到达其附近"\"$(date)\""之前由 shell 进行解析awk,并且(由 shell)将其计算为类似于文字字符串"Wed Apr 11 13:43:31 BST 2018"(包括双引号)。我不明白为什么需要有语法错误,因为您所写的内容是有效的 - 尽管阅读起来有些曲折。

答案2

awk单引号结束在 shell 中 分隔程序的字符串。awk它本身永远不会看到它。然后,您可以将程序的初始部分与命令替换提供的更多字符串以及 shell 中的静态字符串连接起来。这一切都发生在awk调用之前。

当然,您可以使用命令替换来修改稍后作为其代码读取的字符串awk,但它并不能真正使代码易于阅读,并且在 shell 的引用规则、分词等方面可能相当脆弱。

最好以awk通常的方式设置一个变量:

awk -v thedate="$(date)" '{ print $0, thedate }'  <<<"something"

相关内容