首页 > 其他分享 >惊现 awk bug!

惊现 awk bug!

时间:2023-05-03 15:23:41浏览次数:30  
标签:0X2FFFFFFFFFFFFF 0000 惊现 13510798882111486 1111 awk printf bug

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

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

2016-01-30 19:37:30 1454153850967748663 remove alive file
2016-01-30 19:37:34 1454153854621122459 role change to FAULT

一开始写出来是这样的:

awk '
/remove alive file/ {
  start=$3
  printf "%6s: %dn","START",start
}
/role change to FAULT/ {
  end=$3;
  printf "%6s: %dn","END",end
  diff=(end-start)/1000^3
  printf "%6s: %0.9f(s)n","DIFF",diff
}'

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

 START: 1454153850967748608
   END: 1454153854621122560
  DIFF: 3.653373952(s)

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

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

awk 'BEGIN {
  printf "%20s == %-20sn","0X2FFFFFFFFFFFFF","13510798882111487"
  printf "%20X    %dn",0X2FFFFFFFFFFFFF,0X2FFFFFFFFFFFFF
  printf "%20X    %dn",13510798882111487,13510798882111487
  printf "---------------------------------------------n"
  printf "%20s == %-20sn","0X2FFFFFFFFFFFFE","13510798882111486"
  printf "%20X    %dn",0X2FFFFFFFFFFFFE,0X2FFFFFFFFFFFFE
  printf "%20X    %dn",13510798882111486,13510798882111486
}'

输出结果如下:

0X2FFFFFFFFFFFFF == 13510798882111487   
      30000000000000    13510798882111488
      30000000000000    13510798882111488
---------------------------------------------
    0X2FFFFFFFFFFFFE == 13510798882111486   
      2FFFFFFFFFFFFE    13510798882111486
      2FFFFFFFFFFFFE    13510798882111486

对应的二进制数值如下:

0X30000000000000: 11 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0X2FFFFFFFFFFFFF: 10 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111
0X2FFFFFFFFFFFFE: 10 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1110

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

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

awk '
/remove alive file/ {
  start=$3
  printf "%6s: %sn","START",start

标签:0X2FFFFFFFFFFFFF,0000,惊现,13510798882111486,1111,awk,printf,bug
From: https://www.cnblogs.com/0227-yyds/p/17369094.html

相关文章

  • 记录一下MAX在动画制作中遇到文件大小无限膨胀的BUG
    最新在用MAX的biped骨骼做动画,一个简单的角色动画,用到了运动混合器,随着项目的推进,诡异的事情开始出现,文件变得无比庞大,但文件内都是链接,模型面数也不到1w,但文件大小却膨胀到了300多MB这使得打开和保存变得无比慢,但是用首选项里的“压缩保存的文件”选项却可以把工程文件压缩到4MB......
  • Debug Assertion Failed!:Expression: can't dereference out of range vector iterato
    1#include<iostream>2#include<vector>3usingnamespacestd;4boolFind(inttarget,vector<int>array){5autobegin=array.begin(),end=array.end(),mid=begin+(end-begin)/2;6while((target!=*mid)&&a......
  • 【牛客编程题】shell34题(Linux awk,grep命令)
    【牛客编程题】shell34题(Linuxawk,grep命令)SHELL01-22:基本文本处理SHELL23-28:nginx日志分析SHELL29-32:netstat练习做题链接:https://www.nowcoder.com/exam/oj?page=1&tab=SHELL%E7%AF%87&topicId=195参考资料:https://github.com/jaywcjlove/linux-command文章目录从awk命令开始对......
  • openAI cookbook - debug
     当用GPT失败的时候应该怎么办?更好的promptfinetune模型不行,letitbeWhenGPT-3failsonatask,whatshouldyoudo?Searchforabetterpromptthatelicitsmorereliableanswers?Investinthousandsofexamplestofine-tuneacustommodel?Assumethemode......
  • 发现ROS7的CHR或者X86版本的一个BUG,测试环境如下。但是ROS6没这个问题
    测试环境esxi5.5版本在DELLR640的服务器,CPU为志强金牌6226R(估计金牌银牌的CPU都会有这个情况)的情况下,无法启动,反复重启。如下图。暂时不确定,如果升级esxi为6.0以上版本是否有这个问题! ......
  • awk判断整除(包含小数和负数)
    awk判断整除常用的方法是用内置的int或者求余数的算符%被整数整除输出0-100之间能被9整除的整数使用num/9==int(num/9)的判断方法可以很好实现。awk'BEGIN{for(i=0;i<100;i++){if(i/9==int(i/9))printi}}'|cat或者使用num%9==0也可以轻松实现......
  • Teamcenter用本地胖客户端启动时,可以看到定制包的插件菜单项,但是用DEBUG启动时,看不到
    1、用本地胖客户端启动时,可以看到定制包的插件菜单项,但是用DEBUG启动时,看不到?原因:是因为DEBUG模式下,是采用JAVA1.8来运行的。但是本机的胖客户端是采用JAVA11来运行的解决办法:换成JAVA11就可以了 ......
  • 关于oracel 递归语法start with connect by 和 left join 一起使用的一个bug
    左表为树状结构机构表A,右表为人员表(有机构ID字段)BSELECTA.*,B.*FROMALEFTJOINBONA.ORG_ID=B.ORG_IDSTARTWITHA.ORG_ID='011000000004'CONNECTBYPRIORA.ORG_ID=A.P_ORG_ID查询结果出现,B表中的1条记录,最后重复出现。(最终的结果可能为:对A和B......
  • python 调试 debugger
    调试(Debugging)利用好调试,能大大提高你捕捉代码Bug的。大部分新人忽略了Pythondebugger(pdb)的重要性。在这个章节我只会告诉你一些重要的命令,你可以从官方文档中学习到更多。译者注,参考:https://docs.python.org/2/library/pdb.htmlOrhttps://docs.python.org/3/library/pd......
  • 集成Hawk 2.0.1,遇到gson冲突的解决办法
    这个错误提示是因为在两个不同的库中都包含了相同的类(com.google.gson.ExclusionStrategy)。解决方法如下:删掉其中一个库。如果你的项目中只需要其中一个库,那么可以直接删除另一个库,或者将其从依赖中移除。升级库版本。如果两个库都是必需的,那么可以尝试升级其中一个库的版本......