首页 > 解决方案 > 在 awk 中使用 date 命令的问题

问题描述

我正在编写一段 awk 代码来读取这种格式的日志文件:

[03/02/2020 10:01:01]   SOME DATA
[03/02/2020 10:05:25]   SOME MORE DATA
[03/02/2020 11:54:38]   AND YET SOME DATA

等等

我希望通过组合字段中的数据$1$2在它们之间包含一个空格来满足 bashdate命令所需的输入格式来确定纪元时间戳。

这是我编写的代码部分:

cmd="date -d" substr($1,2,10) substr($2,1,8) " +%s"
cmd | getline this_date
print this_date

目前,当我运行脚本时,我收到此错误...

date: invalid date ‘03/02/202010:01:01’
date: invalid date ‘03/02/202010:05:25’
date: invalid date ‘03/02/202011:54:38’

等等

所以在我看来,我快到了,但正如预期的那样,date 命令需要在日期和时间部分之间留一个空格。

我已经尝试了很多方法来尝试substr($1,2,10) substr($2,1,8)在上面的第一行代码之间编写一个“空格”,但每次我都遇到错误。

谁能建议最好的方法?

标签: dateawk

解决方案


substr您在提取的两个 s 之间缺少空格;并且您需要添加引号以将它们连接成单个字符串。

cmd="date -d \"" substr($1,2,10) " " substr($2,1,8) "\" +%s"

如果您可以使用单引号而不是双引号,那将简化一些事情;但是 awk 脚本通常在单引号之间传递,所以我假设您在这里更喜欢双引号。

只是为了说明这一点,正在运行的命令是

date -d "03/02/2020 10:01:01" +%s

这变成了

date
-d
03/02/2020 10:01:01
+%s

一旦shell完成解析它。引号对于将选项的参数保留-d为单个字符串是必要的,即使它包含空格。因此,这实际上更像是一个 shell 问题,而不是 Awk 问题。


推荐阅读