当前位置: 首页 > 面试题库 >

使用awk检查两个日期之间

东郭源
2023-03-14
问题内容

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

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


 类似资料:
  • 问题内容: 我从Stackoverflow那里获得了这段代码,并对其进行了少许更改以适应今天的日期。 我想检查今天是否适合两个日期之间。但这是行不通的。我想念什么? 问题答案: 编辑: 使用<=或> =来计算今天的日期 这是您的代码的正确答案。只需使用strtotime()php函数

  • 问题内容: 我有这个模型: 和存储库为 我想做的是,我将传递一个日期,并需要检查该日期在和之间(例如,我将9月30日作为日期传递,并且需要查找9月30日在其和之间的所有条目) 像什么? 问题答案: 您应该看一下参考文档。很好解释。 就您而言,我认为您不能在两者之间使用,因为您需要传递两个参数 之间 -findByStartDateBetween…其中x.startDate在?1和?2之间 根据您的

  • 我要做的是,我将传递一个日期,并需要检查该日期在和之间(例如,我将9月30日传递为日期,并需要找到所有在和之间具有9月30日的条目) 类似于?

  • 问题内容: 以下查询: 什么也不返回。 我应该有足够多的数据来使查询工作。我究竟做错了什么? 问题答案: 您的第二个日期早于您的第一个日期(即,您正在查询2010年9月29日至2010年1月30日之间)。尝试颠倒日期的顺序:

  • 这是我在SQL Server上的查询: 使用JPA存储库的正确语法是什么? 我试过这个: 并收到此错误: 验证失败,无法查询方法 public abstract java.lang.Long com.finance.biblioteca.repository.NoleggioRepository.countByUtenteIdAndLibroId(java.lang.Long,java.lang.

  • 问题内容: 我想查询一个mySQL表以提取两次和两次之间的数据。我知道如何使用“ between”调用对单个“ datetime”列执行此操作,但是我的列是一个“ date”列和一个“ time”列。我在网上可以找到的所有解决方案都是针对单个datetime列的。 我的范围从15:30的“ day1”到15:14的day1 + 1day 到目前为止,我可以获得以下范围(有效): 但是我显然需要合并