【发布时间】:2019-10-17 05:00:40
【问题描述】:
所以背景是我在 awk 中使用 date 命令。此命令在 Linux/GNU 上与 OSX 有不同的标志。我在$date 变量中存储带有标志的正确命令来解决这个问题。以下 awk 命令(依赖于字符串连接)失败:
awk '{
cmd = "'$date'" substr( $1, 1, length($1) - 3 ) " +\"%Y-%m-%d %H:%M\""
if ( (cmd | getline dd) > 0 ) {
$1 = dd
}
close(cmd)
print
}'
有错误:
awk: non-terminated string date... at source line 2
context is
>>> <<<
awk: giving up
source line number 3
用echo替换awk时,命令输出正确:
{
cmd = "date -r " substr( $1, 1, length($1) - 3 ) " +\"%Y-%m-%d %H:%M\""
if ( (cmd | getline dd) > 0 ) {
$1 = dd
}
close(cmd)
print
}
当上述脚本直接放入 awk 时,它也能正确解析日期(它将标准输入每一行的第一个参数作为时间戳,去除微秒并将日期转换为人类可读的格式)。
$date 变量填充如下:
date="date -d @"
date -d @1550000000 &>/dev/null
if [ $? -eq 1 ]; then
date="date -r "
fi
【问题讨论】:
-
你应该使用
-v name=value语法传递日期变量,即awk -v dt="$date" '...' file -
之后我可以在 awk 脚本中将其称为 $dt 吗?
-
那行得通,如果将评论移到那里,我可以接受答案。我仍然很好奇上面的字符串连接有什么问题(即使它不是最好的解决方案,我也想了解这个 bash 怪癖)。
-
@AlexanderTsepkov,问题看起来像 awk 撇号在第一个双引号后立即关闭。右大括号之后的最后一个字符似乎是预期的。
-
@AlexanderTsepkov 您遇到的具体问题与您填充 shell 变量
date的方式有关。设置/使用 awk 变量而不是让 shell 变量在脚本中扩展的一个原因是,当您的 shell 变量包含意外内容时,避免收到类似这样的神秘错误消息。我们看不到你是如何填充它的,所以我们无法帮助解释这个问题。另外:不要创建与命令名称同名的变量 - 这是混淆代码和创建隐蔽错误的可靠方法!