linux中awk进行日志文本的处理过滤 |
您所在的位置:网站首页 › 过滤文本文件关键字 › linux中awk进行日志文本的处理过滤 |
对于awk命令的介绍可查看linux命令大全http://man.linuxde.net/awk linux下日志分析很常见也很重要,看见那一片如汪洋般的日志,想死的心都有了,过滤出关键日志,查看重要信息,定位分析问题也是必须要掌握的一门技能; 因此coding的时候对日志格式的设计规范很重要,直接决定了bug的定位速度,一般日志过滤处理主要有以下几种方式: 1.查找关键日志grep 2.精简日志内容 sed 3.对记录进行排序sort 4.统计日志相关记录数 awk 这里我介绍下awk这种linux中的文本处理技术。 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。 awk命令格式和选项 语法形式 awk [options] 'script' var=value file(s) awk [options] -f scriptfile var=value file(s) 常用命令选项 -F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F: -v var=value 赋值一个用户定义变量,将外部变量传递给awk -f scripfile 从脚本文件中读取awk命令 -m[fr] val 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。 awk的工作原理 awk 'BEGIN{ commands } pattern{ commands } END{ commands }' 第一步:执行BEGIN{ commands }语句块中的语句; 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部 被读取完毕。 第三步:当读至输入流末尾时,执行END{ commands }语句块。 BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。 END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。 pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。
awk简单使用: [plain] view plain copy awk [-v 变量名=变量值] [-Fre] [--] '模式 { 语句 }' 变量名=变量值 文件名 awk [-v 变量名=变量值] [-Fre] -f 脚本文件 [--] 变量名=变量值 文件名和sed一样,awk也支持2中方式调用,一种是把awk脚本直接在命令行写入,第二种是把awk写在文件中在命令行中调用。 awk处理方式也与sed类似,对文件中的每一个输入行进行处理,每个处理首先判断是否是模式中匹配的行,是的话就具体执行相应的语句。 不同的是,awk侧重与对每一行的列进行处理,并且,awk脚本和c语言类似也拥有变量,条件判断,循环等复杂语句,所以这里只能简单介绍一下基本应用,详细的请查看后面给出的相关链接。而且,awk在处理所有行前和处理完行后各有BEGIN和END语句做预处理和后置处理。 例1:打印日志中的第2,3列 [plain] view plain copy awk 'BEGIN{FS="@"} {print $2,$3}' demo.log_after_sort #BEGIN中预处理的是,把@号作为行的列分割符,把分割后的行的第2,3列输出 输出:(对于从sort得出的结果作为输入) 10117 INFO 10117 INFO 10117 ERROR 10117 ERROR 10117 ERROR 10222 INFO ...略
例2. 统计日志中INFO,ERROR出现的总数,以及总记录数 [plain] view plain copy #下面的例子是作为命令行输入的,利用单引号作为换行标记,这样就不用另外把脚本写进文件调用了 awk ' BEGIN { FS="@" } { if ($3 == "INFO") {info_count++} if ($3 == "ERROR") {error_count++} } END { print "order total count:"NR #NR是awk内置变量,是遍历的当前行号,到了END区域自然行号就等于总数了 printf("INFO count:%d ERROR count:%d\n",info_count,error_count) } ' demo.log_after_sort 输出: order total count:22 INFO count:5 ERROR count:17 例3. 对指定时间范围内的日志进行统计,包括输出INFO,ERROR总数,记录总数,每个订单记录分类统计 下面的例子综合了前面sed和sort [plain] view plain copy sed -f demo.sed demolog.log | sort -t@ -k2,2n -k3,3r -k1,1 | awk -f demo.awk
[plain] view plain copy #demo.awk BEGIN { FS="@" stime="2011-08-23 19:57:31" etime="2011-08-23 19:57:37" } $1 > stime && $1 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |