突然发现awk原来可以统计同一数据在要处理的文件中所出现的次数. 原来的时候 为了分析数据还自己写程序, 哎, 无语, 当时还以为自己多强, 手工分析不过来的东西写程序处理. 现在想来实在是年少轻狂. 解决问题嘛, 不讲究方式, 只要快速 高效的完成任务就OK了.

好, 今天小试牛刀统计了一下passwd文件中shell部分重复的shell名和出现的次数, 看命令:

$awk -F: '{a[$7]++}END{for (i in a) print i" "a[i]}' /etc/passwd
/bin/false 13
/bin/sh 18
/bin/bash 2
/usr/sbin/nologin 1
/bin/sync 1

解说一下

  • -F: 以: 分割字段
  • a[7]++定义了个名称为a的数组7]++定义了个名称为a的数组7在passwd文件中是shell名,在这里是数组索引.awk的数据- 索引可以是是字符类型这点真 是太帅了.
  • for (i in a) print i” “a[i]
  • 用for循环取出数据来, 这时候i取的时下标, a[i]是里面存储的数据
  • 是$7出现的次数, 狠!
  • 郁闷了, 这办法太强了, 以后再遇到问题还是先baidu, 再google然后再自己动手吧!

补充

后来发现,如果awk玩得不咋熟悉的话,用命令组合也可以实现同样的功能

 awk -F: '{print $7}'|sort|uniq -c /etc/passwd

快速统计日志文件里点击量前十位的URL

关于shell命令,网上流传着很多奇技淫巧,比如说快速统计日志文件里点击量前十位的URL:

awk ‘{print $7}’ /path/to/log | sort | uniq -c | sort -nr | head -n 10