shell - 使用 awk 检查两个日期

标签 shell parsing awk

我有一个包含多个数据结构的文件,如下所示:

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

我想找到在 2010-03-23 12:56:47 和 2010-03- 之间发生的所有事件 payload: SMS-MO-FSM 或 payload: SMS-MO-FSM-INFO 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

关于shell - 使用 awk 检查两个日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4163257/

相关文章:

linux - 如何在我的 shell 脚本中终止 'play' 进程?

json - Scala - 将 Json 对象写入文件并读取它

linux - 用基于匹配组的评估字符串替换字符串(优雅的方式,不使用 for .. in)

bash - 删除大型单词列表中重复项的最快方法?

java - 如何使用 Shell 脚本在日期模式之前换行?

linux - 为什么 && 在 bash 中比 -a 更好?

linux - 我使用哪个命令来查找从特定目录开始的特定文件?

python - 如何使用正则表达式查找调用自身的函数?

android - 求助Android Json解析错误

java - 如何从字符串生成Java源代码?