对于一般日志式数据处理,用到的工具包括有 awk,grep,sort,uniq,cat及管道等就足够了,本文记录一般日志分析的基本使用方法。
awk
一般的格式为:
awk [参数] ‘BEGIN{}{}END{}'
其中BEGIN的括号内是开始执行前的一些设置,如设置一些临时变量等;中间的括号会针对每一条记录执行;END的括号内是执行完所有的数据后的执行操作,如输出一些数据等 。
awk默认的分隔符为单个空格,如果需要设置指定的分隔符,可以使用 -F 参数来指定,如
echo abc^def^ghi^jkl|awk −F '^' '{print $1}'
分隔的结果集中起始位置为1,即$1代码abc。
对于分隔符,可以在BEGIN中设置,如
echo abc^def^ghi^jkl|awk 'BEGIN{FS="^"}{print $1}'
输出的结果同上。
另外,分隔符可以 使用正则表达式,如:
echo abc^def^ghi,jkl|awk 'BEGIN{FS="[,^]"}{print $1,$4}'
则“,”与“^”都作为分隔符参与分隔,等价于
echo abc^def^ghi,jkl|awk −F '[,^]' '{print $1,$4}'
其结果为 abc jkl 。
直接分析下面的语句:
cat log.log |awk −F '^' 'BEGIN{OFS="^"}{if($10==1) print $12,$3;s=gsub(/cn.itrunner/,"&");if(s>1) print $0}'
在BEGIN中指定了执行时print出来的多列数据的分隔符。在中间的括号中可以使用诸如 if , for 等一般流程控制语句,判断相等不等的一样可以用==,!=,>,<,>=,<=等 。
如果需要判断该行中了出现某些特殊字符串的次数,可以使用
s=gsub(/cn.itrunner/,"&")
其中第一个参数为正则表达式,则处所得的结果是”cn.itrunner“这段字符串在该行中的次数。通过这种判断,可以选择性地输出一些数据。·
对于循环,可以使用for,格式同C等等 ,但不用预先声明。需要说明的是AWK中的内建变量NR,NF。
NF:number of fileds,指一行中被分割的字段数目
NR:number of records, 从awk开始执行后,按照记录分隔符读取的数据次数,默认的记录分隔符为换行符,因此默认的就是读取的数据行数
如遍历分割的字段,可以使用
awk 'for(i=0;i<NF;i++){print $i}
$i表示当前所遍历到的字段值。
分割字符串可以使用split函数,函数为
split(源,目标,分隔符)
引用采用数组的引用方式,如a[1],下标从1开始
sort
sort的用法就很简单了,简单地sort就是按默认的顺序排序了。
如果需要按数字大小排序,可以使用 “sort -n”。
指定排序的列:echo "tbc jjj^sef ttt^ohi zdf^jkl y77"|awk −F "^" '{for(i=1;i<NF;i++){print $i}}'|sort −k 2
,即按以空格为分隔的第二字段进行排序 ,输出为
tbc jjj
sef ttt
ohi zdf
−k, −−key=POS1[,POS2] start a key at POS1, end it at POS2
指定从开始排序的字段的范围,如
sort −k 1,2
则会将第一及第二字段进行排序,其他字段不参与
uniq
uniq默认会按整条来uniq, uniq的使用方法比较简单,可以 man
-c, –count 在每行前加上表示相应行目出现次数的前缀编号
-d, –repeated 只输出重复的行
-f, –skip-fields=N 比较时跳过前N 列
-i, –ignore-case 在比较的时候不区分大小写
-s, –skip-chars=N 比较时跳过前N 个字符
-u, –unique 只显示唯一的行
-z, –zero-terminated 使用’\0’作为行结束符,而不是新换行
-w, –check-chars=N 对每行第N 个字符以后的内容不作对照
wc
统计用的,man
-c, –bytes print the byte counts,显示byte的数目
-m, –chars print the character counts,显示字符的数目,同byte的区别要考虑中文
-l, –lines print the newline counts,行数
-L, –max-line-length 显示最长行的长度
-w, –words 显示单词计数