-c -o linux_linux命令之数据统计排序

7e9ce6c71ac0ed96ef72a073684a485b.png

场景

老板交代一个任务,处理一批数据,从文本找出攻击次数top 10的ip。你看了下,这个文本大小有980M,有831136条数据。 目前在我脑海里面,方式大致有三种,一是用excel,不懂计算机的人一般会想到这种方法,但是这么大的文件用excel打开,估计会卡死;二是导入数据库后用sql语句;三是使用linux命令,本篇文章将采用这种方式。

c6de479d382d71c5894f38eeb9d86f8d.png
文本的大小和行数

一条命令搞定

通过命令查看文本每行的数据格式

head -n 1 attact_log.csv

b4b9560716dbf12abe15887e0c961d5a.png

以逗号作为分割符,第一个值是IP,这个是我们要统计的。

最终可以通过以下命令完成统计

cat attack_log.csv |awk -F ',' '{print $1}' |sort |uniq -c |sort -k 1 -n -r |head -n 10

145f89e24c88a9539b311c4bc5f54ccc.png

统计80多万条数据,接近1G的文件,处理时间大约1分钟左右,速度还是可以接受的。对这条命令进行详细讲解一下:

awk -F ',' '{print $1}'

是每行文本的第一列,-F参数表示列的分割符,这里文本是用逗号作为分割列的,如果不写默认是空格。$1表示第一列,这里要注意的是,不是从0开始计数的,0代表完整的一行,这与正则表达式group(0)类似。

sort从字面就可以看出来是排序的意思。之前我以为sort是按照ASCII码来排序的,后来发现不是,网友给的答案是'空字符串<空白字符<数值<a<A<b<B<...<z<Z'。 排序的目的是把相同的行集中在一起,这样才能使用后续的uniq -c命令,对邻近重复的行进行统计,并删除重复的行。结果行的第一列是个数,第二列是值。目前为止top的结果如图:

6aabfdeacc011bad322051d05bb449ce.png

到了uniq这步以完成了每个ip的次数统计,但是没有按照次数降序排序。因此再次使用sort,其中参数-k 1代表以第一列值作为排序的依据;-n表示把第一列当作数字来对待,否则会出现2排在19前面的情况;sort默认是按照升序,-r是让其降序。最后通过head -n 10只显示top 10。

在使用awk命令时,还可添加判断条件,比如要取某列大于10的列,可写成

awk '{if($1>10) {print $1}}'

以个人目前的认知觉得,基本上sql语句能做到的事,linux命令也能够做到。

917bf4e4cbac439e16c0273e623f3e15.png
给未来的自己

有这文档吗?

0
d44e638d9b62c4cefa7e89ad357b7b07.png
kong500

什么文档?

0
4b5f834f277c8acc05da69bebba7dc55.png
去抓水母吧
我觉得用数组应该会更快,这样只需要一次排序就好了。
0
c6b0cf8568b24f9110e168ce384808d2.png
kong500

兄弟,怎么操作?请教。。。

0
ff71c7b7eab7c48cd414eba85d5363f4.png
去抓水母吧
前几天一直在生病,没来得及回。awk -F ',' '{ip[$1]++}END{for(i in ip){print i,ip[i]}}' attack_log.csv |sort -k 1 -n -r|head -n 10 手机打的,没测试过行不行。没有用cat,不用全部加载到内存再打开,内存消耗小一点。
0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值