awk命令结合grep命令处理日志文件的方法,grep过滤出包含所需关键词的行,然后交给awk命令处理,需要的朋友参考下。
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("%u\t%s\n", 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("%u\t%s\n", w[a], a)}' | sort -k1 -rn -t $'\t' > ../res/${pt}_${kw}_${date}.res
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("%u\t%s\n", 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("%u\t%s\n", w[a], a)}'
公司内是用python写的脚本,可以同时连接多台主机进行操作,然后rsync回来。
将多个文件内容合并到一个文件中(不改变格式):
awk '{v=FILENAME}!a[v]++1' *.sort > all.sort
grep, awk中使用shell变量
grep '${kw}' 与正常shell一致
(责任编辑:IT)awk 要加上 '' '${pt}' |