【问题标题】:How do I pass the output of a command that contains quotes as an awk variable?如何将包含引号的命令的输出作为 awk 变量传递?
【发布时间】:2018-02-06 20:31:06
【问题描述】:

希望使用 awk 设置日期变量,但无法正确引用或语法!

awk -v c=$i -v d="date +\"%D %r %Z\"" '{print d c }'

【问题讨论】:

  • @Tony 嗯?多么粗鲁的评论。请删除它或考虑更改为更具建设性的内容。
  • {print d c } 之前尝试BEGIN,否则您必须提供一些输入行以获取awk 以执行print
  • 你能包括实际和预期的输出吗?
  • 将此问题与How do I use shell variables in an awk script?Assigning system command's output to variable 区分开来的标题将是一种改进。当前标题(“awk 变量引号和转义”)非常模糊,如果不点击,可能会认为它是其中一个或两个的副本。

标签: bash shell awk


【解决方案1】:

请考虑:

awk -v d="$(date +'%D %r %Z')" 'BEGIN{print d}'

这里的变化是:

  1. 使用$() 执行日期并取回变量d 的输出。
  2. date 格式使用单引号,这样双引号中就没有双引号
  3. 使用BEGIN 在awk 中执行print 语句。如果您将文件或标准输入提供给 awk 以使其读取记录,则这不是必需的。

【讨论】:

  • 双引号内的双引号会很好,因为您要添加基于 $() 的命令替换——因为这会创建一个全新的引用上下文; d="$(date +"%D %r %Z")" 与当前答案一样有效。因此,虽然它的建议(尽可能使用单引号)最佳实践,但我不确定这个答案的第一行是否正确。
  • @CharlesDuffy 你说得对。我的第一个直觉是代表 OP 把我的头发拉出来,然后把它修好。但是在修复这一切时,我解决了头发拔出的情况。我已经删除了我的第一句话!
  • OP 有可能希望在输出的每一行进入时为其加上时间戳,但问题并不清楚
  • @thatotherguy 我不得不想象这里也是如此,这就是为什么我提到BEGIN 只是为了让这种完全多余且完全无用的资源浪费示例代码起作用。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 2014-01-05
  • 2020-03-28
  • 2011-02-10
  • 2017-07-21
  • 2010-12-24
相关资源
最近更新 更多