美文网首页Shell和命令我用 LinuxLinux学习之路
linux下文本分析的神器—awk命令

linux下文本分析的神器—awk命令

作者: DayDayUpppppp | 来源:发表于2017-03-22 20:43 被阅读82次
    awk命令简介:

    awk 是一个很强大的文本分析命令。awk的功能,简单来说就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

    awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。

    小结了关于awk命令最常用的几种方式,写了3个demo

    使用的方式:

    #xxxx  表示的是awk命令参数的具体的格式
    awk  xxxxx     文件路径
    cat  文件路径   | awk  xxxxx
    

    awk编程:

    awk ' {print $1}'    /home/filename.txt  #输出文件的第一列
    
    #这里创建了自定义的变量 count,注意 创建只定义的变量是不需要加$符号的,print的时候也不需要加
    awk ' BEGIN {count=0}  {count++ ; print count $1}'   /home/filename.txt  
    
    # 语法格式
    awk ' BEGIN {XXXX}  {XXXX}  END{XXXX} '
    awk 'BEGIN {count=0;sum=0}   xxxxx '                              #语句之间 + 分号
    awk 'BEGIN {res[$1]++}  END{for (r in res) print r"  "res[r]} '   # for 要写成 for (r in res)      
    
    

    Demo 1:

    #该命令用来列出目前与过去登录系统的用户相关信息
    zhaozheng@myubuntu:~$ last -n 5
    
    2017-03-22 19-46-36屏幕截图.png
    zhaozheng@myubuntu:~$ last -n 5 | awk '{print $1}'
    
    2017-03-22 19-50-02屏幕截图.png 2017-03-22 19-51-15屏幕截图.png 2017-03-22 19-51-05屏幕截图.png

    awk命令默认的格式是“空格”作为$的分隔符。但是也可以通过 -F 参数指定。比如 下面这样,将空格作为分隔符,更改为: 符号。

    -F  ' : '
    
    2017-03-22 20-21-03屏幕截图.png

    注意 : BEGIN 是区分大小写的!!!!

    Demo 2:
    使用awk 来统计单词的个数

     awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd
    
    2017-03-22 20-42-25屏幕截图.png

    DEMO 3:
    写一个好玩的,使用awk分析一个网站的pv。从
    网站服务器被访问的ip里面,找出top10。

    这是网站的log日志。


    2017-03-22 21-06-18屏幕截图.png

    使用awk命令查看日志的条数,总共有14620条。(count从0开始的)

    awk 'BEGIN {count=0;} {name[count]=$1 count++} END {print count} ' ./access.log.10 
    14619
    

    下一步使用awk命令,统计在1万4千条访问服务器的ip里面统计top10。

    cat access.log.10 | awk ' {res[$1]++} END {for(r in res) print r"\t"res[r] } ' | sort -k2 -r | head -n 10
    163.177.71.12   972
    101.226.68.137  972
    183.195.232.138 971
    50.116.27.194   97
    14.17.29.86 96
    61.135.216.104  94
    61.135.216.105  91
    61.186.190.41   9
    59.39.192.108   9
    220.181.51.212  9
    

    awk 相当于创建了一个map,key是ip,value是对应的次数。然后一行一行的读入。在使用sort命令排序,使用head 显示前10个。

    2017-03-22 21-15-46屏幕截图.png

    网站log日志下载连接:
    https://github.com/zhaozhengcoder/hadoop/tree/master/awk/logfile

    当然,也可以使用hadoop的mapreduce框架来分析一波。


    练习

    grade.txt 文件

    zhao 90
    qian 80
    cun 70
    li 60
    zhou 50
    wu 40
    en 30
    wang 20
    
    1. 统计行数
    awk 'BEGIN {count=0} {count+=1} END{print count}' grade.txt 
    
    1. 统计平均成绩
    awk 'BEGIN {sum=0;count=0} {sum+=$2;count+=1} END{print sum/count}' grade.txt 
    
    1. 统计前三名
    zz@ubuntu:~/code$ cat grade.txt | sort -k2 |tail -n 3
    cun 70
    qian 80
    zhao 90
    
    # sort -k2   ##表示的是按照第二类的大小,从小到大排序
    # tail -n 3  ##显示最后的三行
    

    对于一个新的grade.txt 文件,统计每个名字出现的次数

    zhao 90
    qian 80
    sun 70
    zhao 90
    zhao 90
    zhao 90
    zhao 90
    qian 80
    sun 70
    
    awk '{res[$1]++} END{for (r in res) print r" "res[r]}' grade.txt 
    
    qian 2
    zhao 5
    sun 2
    

    要注意的语法:

    1. 分号表示换行 ;
    2. for 的写法 for (r in res) print r" "res[r]

    PS :

    如果不用awk,用python就有点小复杂(起码代码量会多一点)
    对于grade.txt文件

    zhao 90
    qian 80
    sun 70
    zhao 90
    zhao 90
    zhao 90
    zhao 90
    qian 80
    sun 70
    
    f= open('grade.txt','r')
    count={}
    for line in f.readlines():
        key = line.strip().split(' ')[0]
        if key not in count:
            count[key]=1
        else:
            count[key]+=1
    
    for key in count:
        print (key," ",count[key])
    

    相关文章

      网友评论

        本文标题:linux下文本分析的神器—awk命令

        本文链接:https://www.haomeiwen.com/subject/cdhanttx.html