相关工具与文件
- 操作系统CentOS7
- GNU Awk 4.0.2
- GNU sed 4.2.2
- ss-server 日志文件ss.log
任务目标
统计ss.log中出现的不重复的ip的访问次数
分析过程
首先查看ss.log文件的大小
wc -l ss.log
# 69149 ss.log
...
接着取出其中的5行进行人工分析
tail -n 5 ss.log
# 2018-07-16 14:04:44 INFO connecting sync-624-us-west-2.sync.services.mozilla.com:443 from 105.150.63.146:29776
......
由此可见IP地址出现的位置在第7列,那么接下来使用awk命令把记录中的第7列取出
tail -n 5 ss.log | awk '{pring $7}'
# 105.150.63.146:29776
...
于是得到了带有ip:port 的列表数据,但是我需要的仅仅是ip地址,那么接下来是取出ip地址部分,使用强大的流编辑器sed直接取出ip地址部分
ps:sed使用的是基础正则表达式,不是perl正则表达式, 语法有些差异
tail -n 5 ss.log | awk '{pring $7}' | sed 's/:[0-9]\+//g '
# 105.150.63.146
...
's/:[0-9]+//g' 正则的作用是把:符号以及:符号后面所有的数字全部替换为空
接下来使用awk命令 对ip进行统计
awk '{IP[$1]++}END {for(a in IP) print a"-----"IP[a]}'
tail -n 5 ss.log | awk '{pring $7}' | sed 's/:[0-9]\+//g ' | awk '{IP[$1]++}END {for(a in IP) print a"-----"IP[a]}'
# 105.150.63.146-----3
...
统计末尾的5行文件,得出IP为105.150.63.146的地址请求了3次请求,接下来吧tail命令换成cat命令,对整个文件进行统计
cat ss.log | awk '{pring $7}' | sed 's/:[0-9]\+//g ' | awk '{IP[$1]++}END {for(a in IP) print a"-----"IP[a]}'
# 105.150.63.146-----13503
...
最后把这一串命令写成脚本保存,方便下次继续使用
#! /bin/bash
cat ss.log | awk '{pring $7}' | sed 's/:[0-9]\+//g ' | awk '{IP[$1]++}END {for(a in IP) print a"-----"IP[a]}'
非常帮…很nice,不过用python统计是不会更加简单些呢
使用任何一种服务端编程语言都能很好的完成这个任务,如果你对python比较熟悉,当然用python会更好