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

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

47f9c67daa63

2017-03-22 19-46-36屏幕截图.png

zhaozheng@myubuntu:~$ last -n 5 | awk '{print $1}'

47f9c67daa63

2017-03-22 19-50-02屏幕截图.png

47f9c67daa63

2017-03-22 19-51-15屏幕截图.png

47f9c67daa63

2017-03-22 19-51-05屏幕截图.png

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

-F ' : '

47f9c67daa63

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

47f9c67daa63

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

Demo 2:

使用awk 来统计单词的个数

awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd

47f9c67daa63

2017-03-22 20-42-25屏幕截图.png

DEMO 3:

写一个好玩的,使用awk分析一个网站的pv。从

网站服务器被访问的ip里面,找出top10。

这是网站的log日志。

47f9c67daa63

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个。

47f9c67daa63

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

当然,也可以使用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])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值