Shell和命令我用 LinuxLinux学习之路

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

2017-03-22  本文已影响82人  DayDayUpppppp
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])
上一篇 下一篇

猜你喜欢

热点阅读