【发布时间】:2012-01-17 00:45:40
【问题描述】:
假设我有两个日志文件(input.log 和 output.log),格式如下:
2012-01-16T12:00:00 12345678
第一个字段是处理时间戳,第二个字段是唯一 ID。我正在寻找:
- 来自
input.log的记录在output.log中没有与该ID 对应的记录 - 来自
input.log的记录具有该 ID 的记录,但时间戳差异超过 5 秒
我有一个workaround solution with MySQL,但我希望删除数据库组件并使用 shell 脚本处理它。
我有以下内容,如果output.log 包含 ID,则返回 input.log 的行并添加一列:
join -a1 -j2 -o 0 1.1 2.1 <(sort -k2,2 input.log) <(sort -k2,2 output.log)
示例输出:
10111 2012-01-16T10:00:00 2012-01-16T10:00:04
11562 2012-01-16T11:00:00 2012-01-16T11:00:10
97554 2012-01-16T09:00:00
主要问题:
现在我有了这些信息,我该如何计算这 2 个时间戳之间的差异并丢弃相隔 5 秒以上的时间戳?我在使用date(特别是T)处理ISO 8601 时间戳时遇到了一些问题,并假设一定有更好的方法。
次要问题:
是否有办法重新设计整个方法,例如变成单个 awk 脚本?我对处理多个文件和为输出条件设置正确不等式的知识是这里的限制因素,因此采用了上述方法。
【问题讨论】:
-
回到当我不得不对时差进行 awk 计算时,它跨越了日、月、年的界限,如果有一个免费赠品数据库来为我进行计算,我会杀了 ;-)。绝对可以用 awk 计算时间差异。在此处搜索我的一些早期帖子以获取一些想法。也不要对您当前的方法感到难过。 Unix 工具包管道哲学就是将您的问题分解为可解决的部分。您已经解决了一大块问题,而您只需要一个 awk 过滤器就可以完成它。进入下一个问题! (在 awk
sub("T", " ", $2) & $3到 elim T 及时。祝你好运。 -
如果您有 GNU 日期,您可以使用它来转换为 UNIX 时间,执行数学运算然后再转换回来。
-
我已尝试在 awk 单行(大单行)中解决您的问题。让我知道这是否适合您。
标签: bash date awk unix-timestamp iso8601