zoukankan      html  css  js  c++  java
  • 统计ip的发送频率和该ip发送的有效消息(去除相似消息)的数目

    一.统计ip的发送频率

    统计一天日志中以某个时间间隔为单位的ip发送消息的频率。如:统计5分钟内ip的发送频率;统计30分钟内ip的发送频率。这里是统计以分钟为基本单位,发送频率即该ip在某时间间隔内的最大发送消息数。

    统计脚本如下,名为ipFrequency.sh。

    #!/bin/sh
    
    if [ "$1" != "" ] && [ "$2" != "" ]; then
        logfile="/data3/im-log/*.webim.log.imp.$1"
        interval=$2
    else
        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"
        exit
    fi
    
    cat $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);
    
    ?>


  • 相关阅读:
    夯实Java基础(六)——包装类
    JavaWeb:Cookie
    JavaWeb:HttpServletResponse
    JavaWeb:ServletResponse
    JavaWeb:HttpServletRequest
    JavaWeb:ServletRequest(二)
    JavaWeb:ServletRequest(一)
    JavaWeb:HttpServlet
    JavaWeb:GenericServlet
    Spring:Spring Cloud 2020 年维护路线图
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3127447.html
Copyright © 2011-2022 走看看