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
zhaozheng@myubuntu:~$ last -n 5 | awk '{print $1}'
awk命令默认的格式是“空格”作为$的分隔符。但是也可以通过 -F 参数指定。比如 下面这样,将空格作为分隔符,更改为: 符号。
-F ' : '
注意 : BEGIN 是区分大小写的!!!!
Demo 2:
使用awk 来统计单词的个数
awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd
DEMO 3:
写一个好玩的,使用awk分析一个网站的pv。从
网站服务器被访问的ip里面,找出top10。
这是网站的log日志。
使用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个。
网站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
- 统计行数
awk 'BEGIN {count=0} {count+=1} END{print count}' grade.txt
- 统计平均成绩
awk 'BEGIN {sum=0;count=0} {sum+=$2;count+=1} END{print sum/count}' grade.txt
- 统计前三名
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
要注意的语法:
- 分号表示换行 ;
- 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])