统计大文件中IP出现的次数

相关工具与文件

  • 操作系统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]}'

《统计大文件中IP出现的次数》上有2条评论

发表评论