《awk的bug》要點(diǎn):
本文介紹了awk的bug,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
在對(duì)日志信息進(jìn)行實(shí)時(shí)監(jiān)控分析時(shí),需要對(duì)日志中納秒級(jí)的時(shí)間進(jìn)行計(jì)算,邏輯比較簡單:找出開始時(shí)間、結(jié)束時(shí)間,遇到結(jié)束時(shí)間后輸出時(shí)間間隔.
日志中的部分?jǐn)?shù)據(jù)如下:
一開始寫出來是這樣的:
輸出結(jié)果看似就是我想要的:
有的朋友可能看到這個(gè)結(jié)果后就直接使用了,但是較真的我還是把輸出結(jié)果和bc的結(jié)算結(jié)果比較了一下,沒問題.
接下來我習(xí)慣性的到日志中把每個(gè)輸出結(jié)果進(jìn)行確認(rèn),略一看沒什么不對(duì)的地方,仔細(xì)一對(duì)比,發(fā)現(xiàn)日志中納秒級(jí)的時(shí)間被awk處理后竟然變了.為了進(jìn)行確認(rèn),寫了如下代碼:
輸出結(jié)果如下:
對(duì)應(yīng)的二進(jìn)制數(shù)值如下:
發(fā)現(xiàn)awk的數(shù)值處理范圍超過0X2FFFFFFFFFFFFE(13510798882111486)就不不準(zhǔn)確了(為了找這個(gè)臨界值,費(fèi)了一番功夫),他會(huì)把0X2FFFFFFFFFFFFF當(dāng)成0X30000000000000,如果在awk中對(duì)0X2FFFFFFFFFFFFF進(jìn)行減一計(jì)算,值沒有任何變化,對(duì)0X2FFFFFFFFFFFFE進(jìn)行加法運(yùn)算,加1和加2的結(jié)果都是0X30000000000000,但是awk又可以顯示/處理更大的數(shù)值,從二進(jìn)制結(jié)果中我也沒看出有什么規(guī)律可循.有興趣的可以深入源碼層面研究下.
接下來,毅然放棄awk自身的計(jì)算功能,選擇awk與bc的結(jié)合.于是,把代碼修改成下面的樣子:
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/4532.html