Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在awk中使用date命令时出现问题_Date_Awk - Fatal编程技术网

在awk中使用date命令时出现问题

在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

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


有人能建议最好的方法吗?

您提取的两个子集之间缺少空间;您需要添加引号以将它们连接到单个字符串中

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个问题,但尚未接受任何答案。请阅读并重新审视之前的问题,看看是否有你应该接受的答案。