我有一个包含多个数据结构的文件,如下所示:
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-03-23 14:16:35的第二个事件发生的所有事件。但是,我正在努力思考如何将日期范围放入查询中。我可以使用以下内容将日期放入纪元时间,但是如何在awk中使用以下内容检查日期是否在所需时间之间:
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中为此编写了一个解析器,我希望将此方法用作替代检查器,因此,如果可能的话,我想使用awk。
我更进一步,创建了一个用于时间转换的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将转换分配给变量进行比较:
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中有效,我在最终印刷版中对其进行了检查,但在脚本的比较部分中似乎有问题。
关键的观察结果是您可以使用字母数字比较来比较时间戳,并获得正确的答案-这就是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