首页 > 其他分享 >awk计算到纳秒级的bug

awk计算到纳秒级的bug

时间:2023-06-11 18:02:20浏览次数:27  
标签: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: %d\n","START",start
}
/role change to FAULT/ {
  end=$3;
  printf "%6s: %d\n","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 == %-20s\n","0X2FFFFFFFFFFFFF","13510798882111487"
  printf "%20X    %d\n",0X2FFFFFFFFFFFFF,0X2FFFFFFFFFFFFF
  printf "%20X    %d\n",13510798882111487,13510798882111487
  printf "---------------------------------------------\n"
  printf "%20s == %-20s\n","0X2FFFFFFFFFFFFE","13510798882111486"
  printf "%20X    %d\n",0X2FFFFFFFFFFFFE,0X2FFFFFFFFFFFFE
  printf "%20X    %d\n",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: %s\n" , "START" , start

文章知识点与官方知识档案匹配,可进一步学习相关知识


标签:0000,--,纳秒,13510798882111486,1111,awk,printf,bug
From: https://blog.51cto.com/u_6186189/6458427

相关文章

  • unsigned_int循环停不下来bug
    目录unsignedint的减法永远不会小于0展开查看:死循环for(unsignedinti=5;i>=0;--i){printf("unsignedint永远不会小于0");}......
  • 程序员减少BUG的两个小妙招!
    原创:陶朱公Boy(微信公众号ID:taozhugongboy),欢迎分享,转载请保留出处。​点评:我们说衡量一个程序员水平的高低往往有很多因素,但有一个因素至关重要即代码质量。如果程序员写的功能在测试阶段就被频繁打回,上线了之后,用户反馈这里有问题那里有问题,大家可以想像这样的程序员水平能......
  • 构造和析构的bug
    目录构造析构构造析构父类一定要用virtual的析构函数dtorFa类的~Fa::Fa()没有加virtual,delete就不会调用子类的析构Fa*ptr=newSon,如果deleteptr,就执行的是父类的dtor,而不是子类的析构dtor......
  • BUGKU_PWN_OVERFLOW2_WP
    WP_OVERFLOW2 拿到程序,首先放到我们的kali里面看看是多少位的程序,然后在看看有没有什么安全属性64位程序,并且开启了RELRO,NX也就是说,这道题我们需要使用ROP绕过 使用ida64打开这个程序,对这个程序的伪代码进行分析  首先看看main函数 发现最开始定义的buf是32个字......
  • 重要更新|《Python程序设计开发宝典》例12-7代码有bug
    下图是《Python程序设计开发宝典》第330页例12-7的代码,本意是使用多线程技术进行文件复制,重点演示嵌套函数定义、多线程编程技术以及队列在多线程同步时的用法。在代码中,使用内嵌函数add()创建一个线程负责往队列q中添加要复制的文件和文件夹名称,使用内嵌函数copy()创建多个线程负......
  • linux awk文本
    目录一、awk概念二、awk的工作过程三、awk字符四、内置变量五、getline 六、awk的精准筛选七、例子演示八、实验演示             一、awk概念1.概念:awk是一个功能强大的编辑工具,逐行读取输入文本,主要作用于文件内容,AWK信息的读入也是......
  • Debugging VBA zz
    Onceyou'rewrittenyourVBAproceduresandachievedcleancompileswithouterrors,youarereadytoundertakethemostimportantstepinprogramming:testinganddebugging. Toomanyprogrammersbecomecomplacentoncethecodeiswrittenandtheyge......
  • 常见bug测试分类
    常见的BUG包含以下十种类型: 1、业务逻辑 主要的业务流程走不通或出现错误,比如新增保存不成功。 2、功能操作 一些功能按钮无法进行操作,点击按钮没反应。 3、功能优化 功能操作不方便、不合理的地方需要优化。 4、交互逻辑 分为界面交互和功能交互:界面......
  • 使用 cat 及 awk 命令过滤日志文件,求和、求平均值、最大值、最小值
    1、cat查看日志文件$catall.log 2、根据程序打印日志的位置过滤日志条目catall.log|grep-a'ESIndexAggregationTask.java:254' 3、使用awk定位到日志数值位置本轮总计滚动查询2次,总计返回数据62212条,按空格split,62212是11个位置,所以用awk'{pri......
  • 遇到chrome_options.add_experimental_option ("debuggerAddress", port_number)调起
    1、查看谷歌版本和chromedriver版本是否一致:手动查找ChromeDriver路径。在终端中输入以下命令:whichchromedriver这将输出ChromeDriver的路径,例如:/usr/local/bin/chromedriver可以在Chrome浏览器中输入以下网址来查看版本信息: chrome://version/在命令行中,你可以......