awk与grep处理日志文件

发布时间:2020-01-01编辑:脚本学堂
awk命令结合grep命令处理日志文件的方法,grep过滤出包含所需关键词的行,然后交给awk命令处理,需要的朋友参考下。

linuxjishu/13830.html target=_blank class=infotextkey>awk处理日志文件
 

grep 'www.plcxue.com' log.2014${date} | grep "GET /${pt}?" | awk '{split($0, a, "GET /'${pt}'?"); split(a[2], b, "HTTP/1.1"); split(b[1], c, "?"); print c[2]}' | awk -F '&' '{for (i=1;i<=NF;i++) {if($i ~ /^('${kw}')=/){printf("%s ", $i) ;}} print "";}' | grep "${kw}=" | awk '{w[$1]+=1} END{for (a in w) printf("%ut%sn", w[a], a)}' | sort -k1 -rn -t $'t' > /tmp/wzk/${pt}/${pt}_${kw}_${date}
cat *${pt}_${kw}_${date} | awk -F 't' '{w[$2]+=$1} END{for (a in w) printf("%ut%sn", w[a], a)}' | sort -k1 -rn -t $'t' > ../res/${pt}_${kw}_${date}.res
 

 
grep命令过滤出包含所需关键词的行,然后用awk处理。

split出所需要的那一段文本,可以split多次,下标从1开始:
 

split(src, dst, "分隔符")

将所需要的键值对得到,并按 tab 分割,这里只需要一个,放在变量中${kw}:
 

awk -F '&' '{for (i=1;i<=NF;i++) {if($i ~ /^('x1|x2|x3')=/){printf("%s ", $i) ;}} print "";}'

在每个文件中对2中得到的不同值(还是键值对,但键是相同的)进行统计:
 

awk '{w[$1]+=1} END{for (a in w) printf("%ut%sn", w[a], a)}'

对3中得到的数据进行排序,数量多的在上   -r 逆序, -n数值,-t 分隔符,对tab得加$(对其他无影响,最好都加上$):
 

sort -k1 -rn -t $'t'

对从不同机器上得到的数据,汇总后进行统计,排序后逆序输出到文件:
 

awk -F 't' '{w[$2]+=$1} END{for (a in w) printf("%ut%sn", w[a], a)}'

公司内是用python写的脚本,可以同时连接多台主机进行操作,然后rsync回来。

将多个文件内容合并到一个文件中(不改变格式):
 

awk '{v=FILENAME}!a[v]++1' *.sort  > all.sort
 

grep, awk中使用shell变量
 

grep '${kw}' 与正常shell一致
awk 要加上 ''   '${pt}'