awk数组详解及企业实战案例

3.打印数组:
  1. [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]="zhuzhu";for(key in array) print key,array[key]}'
  2. 1 zhurui
  3. 2 zhuzhu
  4. [root@nfs-server test]#
  1. [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]="zhuzhu";}END {for(key in array) print key,array[key]}'/etc/hosts
  2. 1 zhurui
  3. 2 zhuzhu
  1. 把文件内容第一列作为下标,第二列作为值,放入数组然后输出。
  2. [root@nfs-server test]# cat t3.log
  3. 1 zhurui
  4. 2 zhuzhu
  5. [root@nfs-server test]# awk 'BENGIN{S[$1]=$2;}END{for(k in S) print k,S[k]}' t3.log
  6. [root@nfs-server test]# awk '{S[$1]=$2;}END{for(k in S) print k,S[k]}' t3.log
  7. 1 zhurui
  8. 2 zhuzhu
4、脚本:
  1. #!/bin/awk
  2. BEGIN{
  3. array[1]="zhurui"
  4. array[2]="zhuzhu"
  5. for(key in array)
  6. print key,array[key];
  7. }
  1. [root@nfs-server test]# awk -f t2.awk
  2. 1 zhurui
  3. 2 zhuzhu
  4. [root@nfs-server test]#
5.把文件内容第一列作为下标k,第二列作为值S[k],放入数组S[]然后输出。
  1. [root@nfs-server test]# cat t3.log
  2. 1 zhurui
  3. 2 zhuzhu
  4. [root@nfs-server test]# awk 'BENGIN{S[$1]=$2;}END{for(k in S) print k,S[k]}' t3.log
  5. [root@nfs-server test]# awk '{S[$1]=$2;}END{for(k in S) print k,S[k]}' t3.log
  6. 1 zhurui
  7. 2 zhuzhu
运用综上理解,请做考试题:处理以下文件内容,将域名取出并根据域名进行计数排序处理:(百度和SOHU面试题)
test.log
  1. [root@nfs-server test]# awk -F "/"'{S[$3]=S[$3]+1;}END{for(k in S) print k,S[k]}' test.log
  2. mp3.judong.org 1
  3. post.judong.org 2
  4. www.judong.org 3
最终答案:
  1. [root@nfs-server test]# awk -F "/"'{S[$3]++}END{for(k in S) print k,S[k]}' test.log|sort -rn -k2|head
  2. www.judong.org 3
  3. post.judong.org 2
  4. mp3.judong.org 1
  5. [root@nfs-server test]#
例3:统计Web日志单IP访问排名(这个工作中常用,面试也常用)

对于统计访问连接IP个数的答案为:
  1. [root@nfs-server test]# awk -F " "'{S[$1]=S[$1]+1;}END{for (k in S) print k,S[k]}' access-test.log|sort -rn|head ##此方法较复杂
  2. 10.0.0.3775
  3. 10.0.0.1322
  4. 10.0.0.1245
  5. 10.0.0.1202
  6. 10.0.0.1082
  7. 10.0.0.1001
  8. [root@nfs-server test]# awk -F " "'{S[$1]++;}END{for (k in S) print k,S[k]}' access-test.log|sort -rn|head ##上一步的简化版
  9. 10.0.0.3775
  10. 10.0.0.1322
  11. 10.0.0.1245
  12. 10.0.0.1202
  13. 10.0.0.1082
  14. 10.0.0.1001
  15. [root@nfs-server test]# awk -F " "'{Z[$1]++;}END{for (k in Z) print k,Z[k]}' access-test.log|sort -rn|head
  16. 10.0.0.3775
  17. 10.0.0.1322
  18. 10.0.0.1245
  19. 10.0.0.1202
  20. 10.0.0.1082
  21. 10.0.0.1001
方法1:
方法2:
 
例4:统计企业工作中高并发linux服务器不同网络连接状态对应的数量

方法1:
  1. [root@nfs-server test]# awk '/^tcp/ {S[$NF]++}END{for(k in S) print S[k],k}' netstat.log|sort -rn|head
  2. 105 TIME_WAIT
  3. 101 ESTABLISHED
  4. 55 FIN_WAIT2
  5. 7 FIN_WAIT1
  6. 5 SYN_RECV
  7. 5 LISTEN
  8. 3 LAST_ACK
  9. 1 CLOSING
  10. [root@nfs-server test]#
方法2:
  1. [root@nfs-server test]# awk '/^tcp/ {print $NF}' netstat.log|sort|uniq -c|sort -rn|head
  2. 105 TIME_WAIT
  3. 101 ESTABLISHED
  4. 55 FIN_WAIT2
  5. 7 FIN_WAIT1
  6. 5 SYN_RECV
  7. 5 LISTEN
  8. 3 LAST_ACK
  9. 1 CLOSING
  10. [root@nfs-server test]#
例5:
分析图片服务日志,把日志(每个图片访问次数*图片大小的总和)排行,取top10,也就是计算每个url的总访问大小

说明:范例7的生产环境应用:这个功能可以用于IDC及CDN网站流量带宽很高,然后通过分析服务器日志哪些元素占用流量过大,进而进行优化裁剪该图片(见老男孩发布的《淘宝的双十一超大流量应对文章点评》),压缩js等措施。

本题需要输出三个指标: 【访问次数】    【访问次数*单个文件大小】   【文件名(可以带URL)】

解答:

测试数据

59.33.26.105 - - [08/Dec/2010:15:43:56 +0800] "GET /static/images/photos/2.jpg HTTP/1.1" 200 11299"http://oldboy.blog.51cto.com/static/web/column/17/index.shtml?courseId=43" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"

59.33.26.105 - - [08/Dec/2010:15:43:56 +0800] "GET /static/images/photos/2.jpg HTTP/1.1" 200 11299"http://oldboy.blog.51cto.com/static/web/column/17/index.shtml?courseId=43" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"

59.33.26.105 - - [08/Dec/2010:15:44:02 +0800] "GET /static/flex/vedioLoading.swf HTTP/1.1" 200 3583"http://oldboy.blog.51cto.com/static/flex/AdobeVideoPlayer.swf?width=590&height=328&url=/[[DYNAMIC]]/2" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"

124.115.4.18 - - [08/Dec/2010:15:44:15 +0800] "GET /?= HTTP/1.1" 200 46232 "-" "-"

124.115.4.18 - - [08/Dec/2010:15:44:25 +0800] "GET /static/js/web_js.js HTTP/1.1" 200 4460 "-" "-"

124.115.4.18 - - [08/Dec/2010:15:44:25 +0800] "GET /static/js/jquery.lazyload.js HTTP/1.1" 200 1627 "-" "-"

法一:通过两个数组来计算

因为我们要的最终结果是某个文件的访问次数和消耗的流量,所以考虑建立以文件名为索引的两个数组,一个存储访问次数,一个保存消耗的流量,这样当使用awk按行遍历文件时,对次数数组+1,同时对流量数组进行文件大小的累加,等文件扫描完成,再遍历输出两个数组既可以得到该文件的反问次数和总的流量消耗。

[root@locatest scripts]# awk '{array_num[$7]++;array_size[$7]+=$10}END{for(x in array_num){print array_size[x],array_num[x],x}}' access_2010-12-8.log |sort -rn -k1|head -10 >1.log

法二:

[root@locatest scripts]# awk '{print $7"\t" $10}' access_2010-12-8.log|awk '{S[$1]+=$2;S1[$1]+=1}END{for(i in S) print S[i],S1[i],i}'|sort -rn|head -10 >2.log

[root@locatest scripts]# diff 1.log 2.log

[root@locatest scripts]# cat 1.log

57254 1 /static/js/jquery-jquery-1.3.2.min.js

46232 1 /?=

44286 1 //back/upload/course/2010-10-25-23-48-59-048-18.jpg

33897 3 /static/images/photos/2.jpg

11809 1 /back/upload/teacher/2010-08-30-13-57-43-06210.jpg

10850 1 /back/upload/teacher/2010-08-06-11-39-59-0469.jpg

6417 1 /static/js/addToCart.js

4460 1 /static/js/web_js.js

3583 2 /static/flex/vedioLoading.swf

2686 1 /static/js/default.js

3.awk数组详解及企业实战案例的更多相关文章

  1. (转)awk数组详解及企业实战案例

    awk数组详解及企业实战案例 原文:http://www.cnblogs.com/hackerer/p/5365967.html#_label03.打印数组:1. [root@nfs-server t ...

  2. awk数组详解、实战

    1.其它编程语言数组的下标一般从0开始,awk中数组下标默认从1开始,也可以从0开始设置: awk 'BEGIN{huluwa[0]="大娃";huluwa[1]="二娃 ...

  3. linux awk命令详解

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  4. awk命令详解二

    awk命令详解 简单使用: awk :对于文件中一行行的独处来执行操作 . awk -F :'{print $1,$4}'   :使用‘:’来分割这一行,把这一行的第一第四个域打印出来 . 详细介绍: ...

  5. shell编程之awk命令详解

    shell编程之awk命令详解 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; out ...

  6. linux awk命令详解,使用system来内嵌系统命令, awk合并两列

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  7. Shell学习(五)—— awk命令详解

    一.awk简介   awk是一个非常好用的数据处理工具,相对于sed常常作用于一整个行的处理,awk则比较倾向于一行当中分成数个[字段]处理,因此,awk相当适合处理小型的数据数据处理.awk是一种报 ...

  8. net core 中间件详解及项目实战

    net core 中间件详解及项目实战 前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的H ...

  9. JavaScript进阶(十)Array 数组详解

    JS array 数组详解 数组的声明方法 arrayObj = new Array(); 的数组 ,并且第一位是5 数组的运算(传地址) var t2=new Array(); t2[0]=1; t ...

随机推荐

  1. Struts2拦截器的执行过程浅析

    在学习Struts2的过程中对拦截器和动作类的执行过程一度陷入误区,特别读了一下Struts2的源码,将自己的收获分享给正在困惑的童鞋... 开始先上图: 从Struts2的图可以看出当浏览器发出请求 ...

  2. ADO.NET 核心对象简介

    ADO.NET是.NET中一组用于和数据源进行交互的面向对象类库,提供了数据访问的高层接口. ADO.NOT类库在System.Data命名空间内,根据我们访问的不同数据库选择命名空间,System. ...

  3. iOS---正确使用NSNotification对象

    我们在开发程序的时候,程序内不同对象间的通信是不可避免的,iOS中主要有以下这些通信方式: iOS中的通信方式 图中按照耦合度的强弱和通信的形式(一对一还是一对多)进行了划分,这篇文章我们主要说一下N ...

  4. WPF自定义RoutedEvent事件代码段

    今天在写东西的时候,发现常用的代码段里没有RoutedEvent的,因此,写了一个代码段,方便以后使用,顺便记录一下,如何做代码段. 1.在项目中新建一个XML文件,将扩展名修改为snippet. 2 ...

  5. Android总结之Gzip/Zip压缩

    前言: 做过Android网络开发的都知道,在网络传输中我们一般都会开启GZIP压缩,但是出于刨根问底的天性仅仅知道如何开启就不能满足俺的好奇心的,所以想着写个demo测试一下比较常用的两个数据压缩方 ...

  6. 【十大经典数据挖掘算法】PageRank

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 我特地把PageRank作为[十大经 ...

  7. LinqToDB 源码分析——设计原理

    我们知道实现了IQueryable<T>接口和IQueryProvider接口就可以使用Linq To SQL的功能.关于如何去实现的话,上一章也为我们引导了一个方向.LinqToDB框架 ...

  8. Java进击C#——开发环境

    在进入本章之前.笔者想说一些话.对于笔者来讲语言没有好坏之分.只有适不适用之别.当上一篇发到首页的时候,我突然发现有可能会引发争论.这是笔者担心的,这也是笔者不想看到的. 笔者想写这一系列的原因不是为 ...

  9. IIS服务器多域名证书绑定443端口解决方案

    一个服务器IIS要绑定多个HTTPS站点(该方法在此之前,有进行测试其他网站域名的ssl证书,测试没有问题) 默认情况一个服务器的IIS只能绑定一个HTTPS也就是443端口 要实现多个站点对应HTT ...

  10. C++ tinyXML使用

    tinyXML下载: http://sourceforge.net/projects/tinyxml/ 加载到项目: 这六个文件添加到你的c++工程中,分别是tinystr.h.tinystr.cpp ...