在awk中使用date命令时出现问题
我正在编写一段awk代码,读取以下格式的日志文件:在awk中使用date命令时出现问题,date,awk,Date,Awk,我正在编写一段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) su
[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)
之间编码一个“空格”,但每次都会出现错误
有人能建议最好的方法吗?您提取的两个子集之间缺少空间;您需要添加引号以将它们连接到单个字符串中
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问题。您提取的两个子之间缺少空格;您需要添加引号以将它们连接到单个字符串中
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日志格式;大多数理智的程序在其日志中产生计算机可读的时间戳;大多数理智的程序在他们的日志中产生计算机可读的时间戳。你有或能得到GNU awk吗?它内置了时间函数,可以使这项任务更简单、更高效,因为您正在使用GNU date来表示-d
,我怀疑您也有GNU awk(如果您不确定,请运行awk--version
)。日志文件中的日期是哪个时区?您将从哪个时区运行该工具?到目前为止,您已经问了4个问题,但尚未接受任何答案。请阅读并重温之前的问题,看看有没有你应该接受的答案。你有或能得到GNU awk吗?它内置了时间函数,可以使这项任务更简单、更高效,因为您正在使用GNU date来表示-d
,我怀疑您也有GNU awk(如果您不确定,请运行awk--version
)。日志文件中的日期是哪个时区?您将从哪个时区运行该工具?到目前为止,您已经问了4个问题,但尚未接受任何答案。请阅读并重新审视之前的问题,看看是否有你应该接受的答案。