统计ip的发送频率和该ip发送的有效消息(去除相似消息)的数目
来源:互联网 发布:f1ash动画制作软件 编辑:程序博客网 时间:2024/05/16 10:39
一.统计ip的发送频率
统计一天日志中以某个时间间隔为单位的ip发送消息的频率。如:统计5分钟内ip的发送频率;统计30分钟内ip的发送频率。这里是统计以分钟为基本单位,发送频率即该ip在某时间间隔内的最大发送消息数。
统计脚本如下,名为ipFrequency.sh。
#!/bin/shif [ "$1" != "" ] && [ "$2" != "" ]; then logfile="/data3/im-log/*.webim.log.imp.$1" interval=$2else echo "***Usage:sh ipFrequency.sh date interval." echo "*****date format is YYYY-MM-DD." echo "*****interval is the ip time interval with minitues as a basic unit." echo "*****Eg:sh ipFrequency.sh 2013-05-12 5" exitficat $logfile | grep sendMsgOk | grep -v "fromUserId=0" |grep "spamReasons=\[\]" | gawk -F"\t" 'BEGIN{interval='$interval'} function getIP(name){ split(name, arr, "="); ip = arr[2]; sub(/^[[:blank:]]*/, "", ip);#去除左空格 sub(/[[:blank:]]*$/, "", ip);#去除右空格 return ip; } function getMins(time){ #将时间转化为分钟数 split(time, tarr, ":"); return tarr[1]*60+tarr[2]; }{ mins = getMins($1); ip = getIP($20); mi[mins"_"ip] ++ ; #将ip映射到分钟数上 if(dict[mins] != 0){ if(index(dict[mins],ip) == 0){ dict[mins] = dict[mins]","ip; } }else{ dict[mins] = ip; }}END{ for(i = 0; i < 24 * 60; i++){ #统计该时间间隔内的ip频率 for(j = i; (j < i + interval) && (j < 24 * 60); j++){ len = split(dict[j], ipArr, "," );#获取该分钟对应的ip列表 for(k = 1; k <= len; k++) { ip = ipArr[k]; fre[ip] += mi[j"_"ip]; iplist[ip] ++; #将该时间段内出现的ip放到数组中 } } #更新ip对应的最大频率 for(k in iplist){ if(fre[k] > max[k]){ max[k] = fre[k]; mintime[k] = int(i/60)":"(i%60); maxtime[k] = int((i + interval)/60)":"((i+interval)%60); } } delete iplist; delete fre; } #输出ip最大频率 for(k in max) { printf("%s-%s\t%s\t%d\n", mintime[k], maxtime[k], k, max[k]); }}'使用如下:sh ipFrequency.sh 2013-06-08 5
即查询5分钟内的ip发送频率。
二.统计ip发送的消息中有效消息(去除相似消息)的个数
主要是通过similar_text()函数实现,该函数可以比较2个字符串的相似度,即相似百分比,给出一个参考博文:Php比较字符串相似度函数的利用
通过读取iplist文件中的ip,去日志文件中查找该ip发送的所有消息,将其所有消息中所有相似的消息去除,统计该ip实际发送的有效的消息是多少。
iplist中的内容如下,第一列为ip;第二列为该ip一天内发送的消息频率,即一天内发送的消息数:
221.179.130.199 581
27.207.158.114 2351
119.248.72.210 639
59.39.154.182 665
113.132.128.88 616
222.44.86.30 855
218.28.35.166 4713
180.213.9.98 1095
59.54.156.243 824
221.179.130.201 662
统计脚本如下,名为levenshtein.php。
<?php//统计ip发送消息的非相似频率(即一个ip对应的不同消息内容的个数)error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);function similarity($str1, $str2){//levenshtein($str1, $str2); if(strlen($str1) < 50 || strlen($str2) < 50){ return -1; } if(abs(strlen($str1) - strlen($str2))/max(strlen($str1), strlen($str2)) >= 0.2) return -1; similar_text($str1, $str2, $distance);return $distance; //(1 - $distance/max(strlen($str1), strlen($str2)));}//var_dump(similarity("2013年业务增长需求,\r\n正在向全国各地招收不同IP地址的\r\n(淘宝信誉代刷人员)、(没有中介)、(免费加入)、(工作时间自由)\r\n(待遇20元/时左右)<可在家做>>,详情请联系客服欣欣QQ: 36387959", "面试兼职淘宝网拍新款男女夏季(欧 韩 日)服装鞋帽、品牌饰品彩妆 商业会展礼仪,发型秀。请加QQ:2367369676将身高 年龄 体重 照片发我"));//exit;function getIPSimFre($ip) { $simArr = array(); $shell = "cat sendMsgOk.2013-06-07 | grep -v 'fromUserId=0' | grep 'spamReasons=\[\]' | grep ip=$ip | awk -F'\t' '{print $11;}'"; exec($shell, $log); foreach ($log as $msgContent) { $arr = explode('=', $msgContent); $content = $arr[1]; $isSim = false; foreach ($simArr as $key => $value) { if (similarity("$key", "$content") > 80) { $simArr[$key] ++; $isSim = true; break; } } if ($isSim == false) { $simArr[$content] = 1; } } global $wfp; $len = count($simArr); if($len <= 20){ fwrite($wfp, "---------------------$ip begin-----------------\n"); foreach ($simArr as $key=>$value) { fwrite($wfp, "$key\t$value\n"); } fwrite($wfp, "----------------------$ip end-------------------\n"); } return $len;}$wfp = fopen(dirname(__FILE__) . '/rubbish', 'w+');$fp = fopen(dirname(__FILE__) . '/iplist', 'r');while ($line = fgets($fp)) { $arr = explode("\t", $line); $ip = trim($arr[0]); $fre = trim($arr[1]); $simfre = getIPSimFre($ip); print "ip=$ip\tfre=$fre\tsimfre=$simfre\n";}fclose($fp);fclose($wfp);?>
- 统计ip的发送频率和该ip发送的有效消息(去除相似消息)的数目
- TCP/IP (二) TCP消息的发送
- UDP协议下内网与公网IP进行发送消息,一对多.且选择不同的客户端发送消息
- 发送的消息
- Handler的发送消息
- 查找窗体和发送消息的API
- 消息的创建发送和接收
- ActiveMQ 消息的发送和接收
- erlang的消息发送和接收
- IP包的生成和发送接口
- /*发送消息,单项的传递消息*/
- 消息队列普通消息的发送
- activeMQ消息队列消息的发送
- MSN发送消息的过程
- linux发送消息的命令
- EAS发送消息的代码
- EAS发送消息的代码
- Rossum--ROSjava的消息发送
- presentModalViewController 的动画效果
- JS常用方法函数
- 将dll添加到assembly(全局程序集缓存)
- jstring 和 char* 转换
- 根据tablename取得对应的所有数据
- 统计ip的发送频率和该ip发送的有效消息(去除相似消息)的数目
- Android 实时获取麦克风输入音量的代码
- 使用管理员权限运行AutoHotkey的Script
- mysql 导入导出数据说明
- insertion sort
- 函数传参(指针)问题
- struts2文件下载 注意中文问题
- 2013-6-8日记
- JavaScript:作为方法的函数