awk 中的单引号

αғs*_*нιη 6 awk

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

$ awk '{print "me "$0 '"notme"} <<<"printme"
me printme
Run Code Online (Sandbox Code Playgroud)

那么我会尝试这个:

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

或者

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

正如它所显示的,这意味着我可以使用 shell 命令替换来做任何事情。

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

roa*_*ima 7

对于第一个

$ awk '{print "me "$0 '"notme"} <<<"printme"
Run Code Online (Sandbox Code Playgroud)

这里发生的事情是:

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

    {print "me "$0 notme}
    
    Run Code Online (Sandbox Code Playgroud)

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

对于第二个

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

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

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

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

# 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"}
Run Code Online (Sandbox Code Playgroud)

双引号字符串在接近它"\"$(date)\""之前awk被shell 解析,并被评估(由 shell)作为类似于文字字符串"Wed Apr 11 13:43:31 BST 2018"(包括双引号)的东西。我不明白为什么需要有语法错误,因为你写的东西是有效的——虽然读起来有些曲折。