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

awk的bug

发布时间:2020-12-15 04:57:44 所属栏目:安全 来源:网络整理
导读:《awk的bug》要点: 本文介绍了awk的bug,希望对您有用。如果有疑问,可以联系我们。 在对日志信息进行实时监控分析时,需要对日志中纳秒级的时间进行计算,逻辑比较简单:找出开始时间、结束时间,遇到结束时间后输出时间间隔. 日志中的部分数据如下: 一开始

《awk的bug》要点:
本文介绍了awk的bug,希望对您有用。如果有疑问,可以联系我们。

在对日志信息进行实时监控分析时,需要对日志中纳秒级的时间进行计算,逻辑比较简单:找出开始时间、结束时间,遇到结束时间后输出时间间隔.
日志中的部分数据如下:

awk

一开始写出来是这样的:

awk

输出结果看似就是我想要的:

awk

有的朋友可能看到这个结果后就直接使用了,但是较真的我还是把输出结果和bc的结算结果比较了一下,没问题.

接下来我习惯性的到日志中把每个输出结果进行确认,略一看没什么不对的地方,仔细一对比,发现日志中纳秒级的时间被awk处理后竟然变了.为了进行确认,写了如下代码:

awk

输出结果如下:

awk

对应的二进制数值如下:

awk

发现awk的数值处理范围超过0X2FFFFFFFFFFFFE(13510798882111486)就不不准确了(为了找这个临界值,费了一番功夫),他会把0X2FFFFFFFFFFFFF当成0X30000000000000,如果在awk中对0X2FFFFFFFFFFFFF进行减一计算,值没有任何变化,对0X2FFFFFFFFFFFFE进行加法运算,加1和加2的结果都是0X30000000000000,但是awk又可以显示/处理更大的数值,从二进制结果中我也没看出有什么规律可循.有兴趣的可以深入源码层面研究下.

接下来,毅然放弃awk自身的计算功能,选择awk与bc的结合.于是,把代码修改成下面的样子:

awk

来自运维生存时间,原文链接:http://www.ttlsa.com/shell/about-awk-bug/

 

(编辑:李大同)

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

    推荐文章
      热点阅读