在对日志信息进行实时监控分析时,需要对日志中纳秒级的时间进行计算,逻辑比较简单:找出开始时间、结束时间,遇到结束时间后输出时间间隔。
日志中的部分数据如下:
|
2016-01-3019:37:301454153850967748663remove alive file
2016-01-3019:37:341454153854621122459role change toFAULT
|
一开始写出来是这样的:
|
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:110000000000000000000000000000000000000000000000000000
0X2FFFFFFFFFFFFF:101111111111111111111111111111111111111111111111111111
0X2FFFFFFFFFFFFE:101111111111111111111111111111111111111111111111111110
|
发现awk的数值处理范围超过0X2FFFFFFFFFFFFE(13510798882111486)就不不准确了(为了找这个临界值,费了一番功夫),他会把0X2FFFFFFFFFFFFF当成0X30000000000000,如果在awk中对0X2FFFFFFFFFFFFF进行减一计算,值没有任何变化,对0X2FFFFFFFFFFFFE进行加法运算,加1和加2的结果都是0X30000000000000,但是awk又可以显示/处理更大的数值,从二进制结果中我也没看出有什么规律可循。有兴趣的可以深入源码层面研究下。
接下来,毅然放弃awk自身的计算功能,选择awk与bc的结合。于是,把代码修改成下面的样子:
|
awk'
/removealivefile/{
start=$3
printf"%6s: %s\n","START",start
|
分享到:
相关推荐
《awk入门到精通》是一本专为对awk语言感兴趣的学习者设计的实用指南,旨在帮助他们理解和掌握awk的基本概念、语法以及如何有效运用这一强大的文本处理工具来解决各类问题。awk作为一种解释型语言,在文本处理领域中...
### awk入门级教材知识点详解 #### 一、awk简介 **awk** 是一种强大的文本处理工具,主要用于在一组文件上查找符合特定模式的行或字段,并执行相应的操作。它简化了数据选择和转换的过程,使其变得更为直观和简单...
awk 教程入门到精通 awk 是一种功能强大的文本处理工具,它可以对文本进行处理、格式化和输出。awk 的主要用途是处理文本文件,提取和处理数据,生成报表等。下面是一份 awk 教程,从基础知识到高级应用,涵盖了 ...
Linux awk 高级应用 awk 是一个基于模式匹配检查输入文本的数据处理引擎,由 Aho Wwinberger Kernighan 创造。它通常用在 shell 中,获取指定的数据,单独使用时,可对文本数据做统计。awk 也是一种编程语言,拥有 ...
输出方面,AWK提供了 `print` 和 `printf` 语句,并能将输出重定向到文件或者管道。 ### AWK在数据处理中的应用 在数据转换和归约方面,AWK能够进行列求和、计算百分比和分位数等。在数据验证方面,AWK可以检查数据...
shell 编程语言简单易学,任何在提示符中能键入的命令都能放到一个可执行的 shell 程序中。 shell 的特性 shell 有多种特性,例如可以执行命令、处理文本文件、编程等。shell 是一个命令语言解释器,拥有自己内建...
示例中使用了awk的内建循环来实现这一点,通过增加数组下标并逐行打印的方式,可以将文件中所有行都存储到数组变量中。 接着,涉及到将汉字转换为URL编码的场景,这通常是为了将文件名或URL参数中的中文字符转换为...
- **动作(Action)**:当模式匹配时,awk执行相应的动作,通常是一段代码,如打印、计算等。 ### 2. awk语法 基本的awk命令格式如下: ```bash awk 'pattern { action }' ``` - `pattern`:匹配的模式,如果...
### awk详细用法小结 #### 一、awk简介与版本 awk是一种强大的文本分析工具,主要用于Linux/Unix系统下的数据处理与报告生成。它支持正则表达式、模式匹配和复杂的文本处理功能,是系统管理员和程序员进行数据处理...
【awk参考资料】深入理解awk awk是一种强大的文本分析工具,主要在Linux/Unix环境中使用,由Alfred Aho、Brian Kernighan和Peter Weinberger三位大师共同开发。它能够处理来自标准输入、文件或命令输出的数据,通过...
通过这些实例的学习,用户不仅能够吸收前人经验,而且能够了解到sed和awk在实际工作中的应用价值。 总之,sed和awk都是UNIX系统中不可或缺的工具,它们在文本处理和数据处理方面提供了强大的功能。通过本书的学习,...
AWK提供了一系列内置函数,例如`length()`用于计算字符串长度,`split()`用于分割字符串,`printf()`用于格式化输出等。 **一.6 命令行使用AWK** 在命令行中,可以将AWK脚本直接作为参数传递,或者使用`-f`选项指定...
总而言之,《GAWK: Effective AWK Programming - GNU Awk编程经典》是一本全面的书籍,涵盖了awk语言的基础到高级特性,并且提供了使用gawk的独特视角。无论是刚接触awk的新手,还是已经具备一定经验希望深入学习的...
awk学习快速入门、基本用法、高级应用。基本入门说明使用的基本方法;高级应用主要是管道的用法
- `awk '/101/,/105/' file`: 显示从包含`101`的行到包含`105`的行之间的所有行。 2. **字段选择与计算** - `awk '$1==5' file`: 显示文件`file`中第一列值为`5`的所有行。 - `awk '$1=="CT"' file`: 显示文件`...
这些内容构成了awk编程的基础,使读者能够进行简单的数据计算和条件判断。 awk的字符串处理功能在文本分析中极为重要。书中详细介绍了字符串函数,如length、index、sub、gsub等,以及如何进行字符串的拼接和比较。...
读者会学习到AWK是如何通过模式空间和动作来处理输入的行,并理解BEGIN和END规则的用途。 2. **模式匹配**:详细讲解AWK的模式匹配机制,包括基本的正则表达式和字段分割。读者将学会如何使用`~`操作符进行模式匹配...