linuxjishu/13830.html target=_blank class=infotextkey>awk命令格式:
awk 'pattern{action;action} pattern{action;action}' {filenames}
日志分析命令
awk 'BEGIN{len=0;tm=0} {len=length($NF);tm=substr($NF,2,len-2)+0} tm>0.5 {print NR " " $0 }'
nginx.log
解释:
1、BEGIN{len=0;tm=0}
在awk开始时,定义变量len和tm
len为字符串长度,tm为响应时间
BEGIN关键字,表示awk命令开时执行一次,不是每行一次,只仅一次。
2、{len=length($NF);tm=substr($NF,2,len-2)+0}
NF为当前行的字段数,awk读入的当前行时,使用空格分隔后的字段数
length()为awk的内置函数,取字符串长度
len=length($NF)表示将最后一个字段的长度,赋值给len
substr()为awk的内置函数,截串
substr($NF,2,len-2)为取字符串"0.0003"中的0.0003,去掉双引号
substr($NF,2,len-2)+0为将字符串0.0003,转为数字0.0003
3、tm>0.5 {print NR " " $0 }
tm>0.5 响应时间超过0.5秒 就打印NR当前行数和$0当前行
代码:
复制代码 代码示例:
awk '/responseTime/ {
where=match($0,/"responseTime":[[:alnum:]]+/);
if(where>0){
spend=substr($0,RSTART,RLENGTH);
len=length(spend);
where = index(spend,":");
spend=substr(spend,where+1,len);
spend=spend+0;
if(spend>10000)
print $0;
}
}'
somelog.log
awk统计日志信息
一些日志统计的问题,使用awk可以很迅速地处理日志中的信息,因此把比较有用的提取出来,比如如下日志:
ALARM 10-31 10:41:02 140038239139584 file[crawling_thread.cc:171] func[request_cb] url[http://bbs.tianya.cn/post-culture-282402-1.shtml] 403, proxy[58.252.56.149:9000] forbiddened
表示代理58.252.56.149端口9000失效了,被服务器封禁了,当日志文件到好几G时,如何快速统计代理ip及被封禁次数,awk命令可以解决:
grep “forbiddened” log/evcrawler.log.20131031 | awk -F “[][]” ‘{w[$8]+=1} END{for (a in w) printf(“proxy:%s, forbid times:%un”, a, w[a])}’
打印每个代理和封禁次数。
加上时间:
awk ‘{if($3 > “12:00:00″) print $0}’ log/evcrawler.log.20131031 | grep “forbiddened” | awk -F “[][]” ‘{w[$8]+=1} END{for (a in w) printf(“proxy:%s, forbid times:%un”, a, w[a])}’