【问题标题】:Problems using the date command command in awk在 awk 中使用 date 命令的问题
【发布时间】:2020-02-07 13:37:29
【问题描述】:

我正在编写一段 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 字段中的数据并在它们之间包含一个空格来满足 bash date 命令所需的输入格式来确定纪元时间戳。

这是我写的部分代码:

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) 之间编写一个“空格”,但每次都出现错误。

谁能建议最好的方法?

【问题讨论】:

  • 您有或可以获得 GNU awk 吗?它具有内置的时间函数,可以使这项任务更容易和更高效,并且由于您使用 GNU 日期作为 -d 我怀疑您也有 GNU awk(如果您不确定,请运行 awk --version)。您的日志文件中的日期是哪个时区?您将从哪个时区运行该工具?
  • I see 到目前为止,您已提出 4 个问题,但尚未接受任何答案。请阅读stackoverflow.com/help/someone-answers,然后重新查看之前的问题,看看是否有您应该接受的答案。

标签: date awk


【解决方案1】:

您提取的两个substrs 之间缺少空格;您需要添加引号将它们连接成一个字符串。

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 问题。

【讨论】:

  • 我猜这是 Apache 日志格式;大多数 sane 程序会在其日志中生成计算机可读的时间戳。
猜你喜欢
  • 2019-03-08
  • 2017-10-09
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 2017-11-25
相关资源
最近更新 更多