使用awk来检查两个date之间

我有一个在其中有多个数据结构的文件,如下所示:

eventTimestamp: 2010-03-23T07:56:19.166 result: Allowed protocol: SMS payload: RCOMM_SMS eventTimestamp: 2010-03-23T07:56:19.167 result: Allowed protocol: SMS payload: RCOMM_SMS eventTimestamp: 2010-03-23T07:56:19.186 result: Allowed protocol: SMS payload: SMS-MO-FSM eventTimestamp: 2010-03-23T07:56:19.197 result: Allowed protocol: SMS payload: COPS eventTimestamp: 2010-03-23T07:56:29.519 result: Blocked protocol: SMS payload: COPS type: URL_IWF result: Blocked 

我想查找所有有效负载的事件:SMS-MO-FSM或负载:发生在时间之间的SMS-MO-FSM-INFO 2010-03-23 12:56:47和2010-03-23 13: 56:47。 在查询这个文件到目前为止,我已经在以下方式使用awk

 cat checkThis.txt | awk 'BEGIN{FS="\n"; RS=""; OFS=";"; ORS="\n"} $1~/eventTimestamp: 2010-03-23T14\:16\:35/ && $4~/SMS-MO-FSM-INFO|SMS-MO-FSM$/ {$1=$1 ""; print $0}' 

这将给我所有在2010年3月23日14:16:35发生的事件。 然而,我正在努力思考如何将date范围放入我的查询中。 我可以使用以下内容将date划分为纪元时间,但是如何在我的awk中使用以下内容来检查date是否在所需时间之间:

 python -c "import time; ENGINE_TIME_FORMAT='%Y-%m-%dT%H:%M:%S'; print int(time.mktime(time.strptime('2010-03-23T12:52:52', ENGINE_TIME_FORMAT)))" 

我知道这可以在Python中完成,但是我已经在Python中为此编写了一个parsing器,并且我想将此方法作为替代检查器,所以我想尽可能使用awk。

我把这个进一步,并创build一个时间转换的Python脚本:

 #!/usr/local/bin/python import time, sys ENGINE_TIME_FORMAT='%Y-%m-%dT%H:%M:%S' testTime = sys.argv[1] try: print int(time.mktime(time.strptime(testTime, ENGINE_TIME_FORMAT))) except: print "Time to convert %s" % testTime raise 

然后,我尝试使用getline将转换分配给一个variables进行比较:

 cat checkThis.txt| awk 'BEGIN {FS="\n"; RS=""; OFS=";"; ORS="\n"; "./firstDate '2010-03-23T12:56:47'" | getline start_time; close("firstDate"); "./firstDate '2010-03-23T13:56:47'" | getline end_time; close("firstDate");} ("./firstDate $1" | getline) > start_time {$1=$1 ""; print $0}' Traceback (most recent call last): File "./firstDate", line 4, in <module> testTime = sys.argv[1] IndexError: list index out of range 

getline在BEGIN中工作,我在最终的打印中检查了它,但是在脚本的比较部分中似乎有问题。

Solutions Collecting From Web of "使用awk来检查两个date之间"

关键的观察是,你可以比较你的时间戳使用字母数字比较,并得到正确的答案 – 这是ISO 8601符号的美丽。

因此,稍微调整一下你的代码,然后格式化以避免滚动条:

 awk 'BEGIN { FS = "\n" RS = "" OFS = ";" ORS = "\n" t1 = "2010-03-23T07:45:00" t2 = "2010-03-23T08:00:00" m1 = "eventTimestamp: " t1 m2 = "eventTimestamp: " t2 } $1 ~ /eventTimestamp:/ && $4 ~ /SMS-MO-FSM(-INFO)?$/ { if ($1 >= m1 && $1 <= m2) print $1, $2, $3, $4; }' "$@" 

显然,你可以把它放到一个脚本文件中 – 你不会经常输入它。 准确方便地输入日期范围是其中的难点之一。 请注意,我已经调整了时间范围以匹配数据。

在样本数据上运行时,会输出一条记录:

 eventTimestamp: 2010-03-23T07:56:19.186;result: Allowed;protocol: SMS;payload: SMS-MO-FSM 

有点混乱,但是这个脚本假定你有unix的“date”命令。 还在BEGIN块中硬编码您的开始和结束时间戳。 请注意,上面列出的测试数据不在您的示例开始/结束时间内。

 #!/usr/bin/awk -f BEGIN { command="date -f\"%s\" -d \"2010-03-23 12:56:47\""; command | getline startTime; close(command) command="date -f\"%s\" -d \"2010-03-23 13:56:47\""; command | getline endTime; close(command) } $0 ~ /^eventTimestamp:/ { command="date -f\"%s\" -d " $2; command | getline currTime; close(command) if (currTime >= startTime && currTime <= endTime) { printIt="true" }else{ printIt="false"; } } printIt == "true" { print }