加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash中的时间戳算法

发布时间:2020-12-15 21:07:16 所属栏目:安全 来源:网络整理
导读:假设我有两个日志文件(input.log和output.log),格式如下: 2012-01-16T12:00:00 12345678 第一个字段是处理时间戳,第二个字段是唯一ID.我试图找到: input.log中的记录,它们在output.log中没有该ID的相应记录 来自input.log的记录,其中包含该ID的记录,但时间
假设我有两个日志文件(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

主要问题:

现在我有了这些信息,我该如何计算两个时间戳之间的差异并丢弃相隔超过5秒的时间戳?我在处理带有日期的ISO 8601时间戳(特别是T)时遇到了一些问题,并且假设必须有更好的方法.

次要问题:

是否有一种方法可以重写整个方法,例如单个awk脚本?我对处理多个文件和设置输出条件的正确不等式的知识是限制因素,因此上面的方法.

解决方法

如果你有GNU awk,那么你可以试试这样的东西 –

gawk '
NR==FNR{a[$2]=$1;next} 
!($2 in a) {print $2,$1; next} 
($2 in a) {
  "date +%s -d " $1 | getline var1;
  "date +%s -d " a[$2] | getline var2;
  var3 = var2 - var1;
  if (var3 > 4) print $2,$1,a[$2]
}' output.log input.log

测试:

[jaypal:~/Temp] cat input.log 
2012-01-16T09:00:00 9
2012-01-16T10:00:00 10
2012-01-16T11:00:00 11

[jaypal:~/Temp] cat output.log 
2012-01-16T10:00:04 10
2012-01-16T11:00:10 11
2012-01-16T12:00:00 12

[jaypal:~/Temp] gawk '
NR==FNR{a[$2]=$1;next} 
!($2 in a) {print $2,$1; next} 
($2 in a) {"date +%s -d " $1 | getline var1; "date +%s -d " a[$2] | getline var2;var3=var2-var1;if (var3>4) print $2,a[$2] }' output.log input.log
9 2012-01-16T09:00:00
11 2012-01-16T11:00:00 2012-01-16T11:00:10

说明:

> NR == FNR {a [$2] = $1; next}

我们首先将output.log文件中的第一个字段存储在第二个字段索引的数组中.我们使用next来阻止其他模式{action}语句运行.使用NR == FNR允许我们完全篡改output.log文件.

>!($2 in a){print $2,$1;下一个}

一旦output.log文件完成.我们从input.log文件开始.我们检查input.log文件中是否存在任何第二个字段在我们的数组中(即output.log文件).如果发现我们打印它.我们继续这一行动,直到我们打印出所有这些字段.

>($2 in a){“date%s -d”$1 | getline var1; “date%s -d”a [$2] | getline var2; VAR3 = VAR2-VAR1; if(var3> 4)打印$2,a [$2]}

在此我们查找两个文件中都存在的字段.当我们找到这些字段时,我们需要输入逻辑来计算差异.我们使用system命令查找日期.现在系统命令默认打印到STDOUT,我们无法控制它们.因此,我们使用awk getline函数管道输出并捕获输出,并将其存储在变量(var1和var2)中.一旦两个日期都存储在变量中,我们就会做差异并存储在var3中,如果发现var3是> 4,我们以您想要的格式打印它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读