2

我有这样的日志文件,我正在尝试检索日期范围

"07/10/2013 01:31:54","SNMP" 

"07/10/2013 01:31:54","SNMP" 
.... ... .. 
"07/10/2013 03:03:54","SNMP"

我正在使用休闲 awk 命令,它给出了所有行,我尝试了不同的组合没有用,是否需要在 awk 中使用标准数据格式?

awk -F, '"07/10/2013 01:35:40" > $1&&$1 <= "07/10/2013 01:50:03"' Mylog.log | wc -l
4

2 回答 2

3

您有两个问题:CSV 解析日期比较

您可以使用第一个match()CSV 解析函数来解决。

您可以通过使用像ISO-8601这样的适当日期格式来解决第二个问题,一个令人愉快的副作用是可以按词法比较日期(例如时区/夏令时更改)。如果你真的使用gawk而不是普通的awk,或者nawk你可以使用内置的日期函数mktime()来解析时间戳并返回一个纪元-秒序数,它允许以数字方式比较日期。 awk没有本机日期/时间类型,也没有标准数据/时间库,因此词法或数字比较是这里最直接的选择。

最后一个选项gawk是一个讨厌的 hack:

/^"07.10.2013 01:35:40"/,/^"07.10.2013 01:50:03"/ {
    # your code here
}

这使用范围表达式将匹配范围限制在某些行之间。这应该适用于您的文件格式,只要时间是单调增加的——这不适用于 Apache 日志(因为它们是按完成顺序记录的,但默认情况下包含原始请求时间戳,并且不保证是单调的增加)。

于 2013-07-10T09:43:08.147 回答
1

字符串比较:

$ awk -F" '"07/10/2013 01:35:40" > $2 && $2 <= "07/10/2013 01:50:03"' file
"07/10/2013 01:31:54","SNMP"
"07/10/2013 01:31:54","SNMP"
.... ... ..

......似乎工作!比较次更好用mktime("YYYY MM DD HH MM SS")

于 2013-07-10T09:42:13.057 回答