有人可以解释一下下面的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"
这里发生的事情是:
- 单引号中的部分将
awk
逐字传递 - 下一部分
"notme"}
由 shell 解析,然后awk
作为结果字符串传递给notme}
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"