awk处理日志文件

 

grep 'www.sogou.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

 

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

  1. split出所需要的那一段文本,可以split多次,下标从1开始 
    split(src, dst, "分隔符")
  2. 将所需要的键值对得到,并按 tab 分割,这里只需要一个,放在变量中${kw}
    awk -F '&' '{for (i=1;i<=NF;i++) {if($i ~ /^('x1|x2|x3')=/){printf("%s ", $i) ;}} print "";}'
  3. 在每个文件中对2中得到的不同值(还是键值对,但键是相同的)进行统计
    awk '{w[$1]+=1} END{for (a in w) printf("%u\t%s\n", w[a], a)}'
  4. 对3中得到的数据进行排序,数量多的在上   -r 逆序, -n数值,-t 分隔符,对tab得加$(对其他无影响,最好都加上$)
    sort -k1 -rn -t $'\t' 
  5. 对从不同机器上得到的数据,汇总后进行统计,排序后逆序输出到文件
    awk -F '\t' '{w[$2]+=$1} END{for (a in w) printf("%u\t%s\n", w[a], a)}'

最重要的如何在不同机器上同时操作,并如何将各个机器中的统计数据汇总到一起,公司内是用python写的脚本,可以同时连接多台主机进行操作,然后rsync回来。

 

另外:

  1. 将多个文件内容合并到一个文件中(不改变格式): awk '{v=FILENAME}!a[v]++1' *.sort  > all.sort
  2. grep, awk中使用shell变量
    grep '${kw}' 与正常shell一致
    awk 要加上 ''   '${pt}'
  3. 更多awk用法可以参考: http://www.cnblogs.com/chengmo/archive/2013/01/17/2865479.html
posted @ 2014-11-08 21:56  午后微醺  阅读(1923)  评论(0编辑  收藏  举报