对Apache日志中的uniq IP地址进行排序

对Apache日志中的uniq IP地址进行排序,apache,bash,sorting,logging,Apache,Bash,Sorting,Logging,我试图从我的apache日志中提取IP地址,对它们进行计数和排序 不管出于什么原因,排序部分都很糟糕 命令如下: cat access.* | awk '{ print $1 }' | sort | uniq -c | sort -n 输出示例: 16789 65.X.X.X 19448 65.X.X.X 1995 138.X.X.X 2407 213.X.X.X 2728 213.X.X.X 5478 188.X.X.X 6496 176.X.X.X

我试图从我的apache日志中提取IP地址,对它们进行计数和排序

不管出于什么原因,排序部分都很糟糕

命令如下:

cat access.* | awk '{ print $1 }' | sort | uniq -c | sort -n
输出示例:

  16789 65.X.X.X
  19448 65.X.X.X
   1995 138.X.X.X
   2407 213.X.X.X
   2728 213.X.X.X
   5478 188.X.X.X
   6496 176.X.X.X
  11332 130.X.X.X
我不明白为什么这些值没有真正排序。我还尝试删除行开头的空格(
sed的//^[\t]*//g'
),并使用
sort-n-t”“-k1
,这不会改变任何东西

有什么提示吗?

这应该行得通

cat access.* | awk '{ print $1 }' | sort | awk '{print $1 " " $2;}' | sort -n
我看不出有什么问题

控制文件中的字符


文件系统已满(临时文件)?

这可能会很晚,但在第一个排序中使用数字将得到所需的结果

cat access.log | awk '{print $1}' | sort -n | uniq -c | sort -nr | head -20
输出:

 29877 93.xxx.xxx.xxx
  17538 80.xxx.xxx.xxx
   5895 198.xxx.xxx.xxx
   3042 37.xxx.xxx.xxx
   2956 208.xxx.xxx.xxx
   2613 94.xxx.xxx.xxx
   2572 89.xxx.xxx.xxx
   2268 94.xxx.xxx.xxx
   1896 89.xxx.xxx.xxx
   1584 46.xxx.xxx.xxx
   1402 208.xxx.xxx.xxx
   1273 93.xxx.xxx.xxx
   1054 208.xxx.xxx.xxx
    860 162.xxx.xxx.xxx
    830 208.xxx.xxx.xxx
    606 162.xxx.xxx.xxx
    545 94.xxx.xxx.xxx
    480 37.xxx.xxx.xxx
    446 162.xxx.xxx.xxx
    398 162.xxx.xxx.xxx

我不知道为什么简单的
排序-n
不起作用,但在计数器和IP之间添加一个非数字字符解决了我的问题

cat access.* | awk '{ print $1 } ' | sort | uniq -c | sed -r 's/^[ \t]*([0-9]+) (.*)$/\1 --- \2/' | sort -rn

为什么要使用cat | awk?您只需使用
awk

awk '{ print $1 }' /var/log/*access*log | sort -n | uniq -c | sort -nr | head -20

如果排序结果不如预期,则可能是由于区域设置问题

| LC_ALL=C排序-rn

awk '{array[$1]++}END{ for (ip in array) print array[ip] " " ip}' <path/to/apache/*.log> | LC_ALL=C sort -rn
awk'{array[$1]+}END{for(数组中的ip)打印数组[ip]“ip}”| LC_ALL=C排序-rn
来源


如果有人想要,这里有一个PHP函数,可以计算哪个ip在文件中出现了多少次

function get_access_ip_count($input_file_name, $output_file_name){
    
    $access_ip_array = array();
    
    $overall_count = 0;
    
    $handle = fopen($input_file_name, "r");
    if ($handle) {
        
        while (($line = fgets($handle)) !== false) {
            
            preg_match('/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/', $line, $matches);
            
            #print_r($matches);
            #exit;
            
            if($matches[0]>0){
                
                #print_r($matches);
                
                $ip = $matches[0];
                #echo "ip: $ip";
                if(!isset($access_ip_array[$ip])){
                    
                    $access_ip_array[$ip] = 1;
                    $overall_count++;
                    
                }
                else{
                    
                    $access_ip_array[$ip]++;
                    $overall_count++;
                    
                }
                
            }
        }
        fclose($handle);
        
        uasort($access_ip_array,"Descending");
        
        echo "<pre>";
        print_r($access_ip_array);
        echo "</pre>";
        
        $output_file = fopen($output_file_name, "w");
        fwrite($output_file, print_r($access_ip_array, TRUE));
        fclose($output_file);
        
        echo "overall_count: $overall_count";
        
    } else {
        echo "Couldn't open file";
    } 
}

function Descending($a, $b) {   
    if ($a == $b) {        
        return 0;
    }   
        return ($a > $b) ? -1 : 1; 
}  
函数get\u access\u ip\u count($input\u file\u name,$output\u file\u name){
$access_ip_array=array();
$total_count=0;
$handle=fopen($input\u file\u name,“r”);
如果($handle){
while(($line=fgets($handle))!==false){
preg_match('/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/',$line,$matches);
#打印(匹配项);
#退出;
如果($matches[0]>0){
#打印(匹配项);
$ip=$matches[0];
#回声“ip:$ip”;
if(!isset($access\u ip\u array[$ip])){
$access_ip_数组[$ip]=1;
$total_count++;
}
否则{
$access_ip_数组[$ip]++;
$total_count++;
}
}
}
fclose($handle);
uasort($access_ip_array,“降序”);
回声“;
打印(访问ip阵列);
回声“;
$output_file=fopen($output_file_name,“w”);
fwrite($output_file,print_r($access_ip_array,TRUE));
fclose($output_file);
回显“总计数:$total计数”;
}否则{
echo“无法打开文件”;
} 
}
函数降序($a,$b){
如果($a==$b){
返回0;
}   
回报($a>$b)?-1:1;
}  

我完全忘记了这个问题,但我设法找到了解决办法。这不起作用(见我的问题)。但是在数字和IP之间添加非数字字符解决了我的问题。Downvote:这个答案完全没有改变,实际答案是ArthurWho的评论,我如何在Apache的ssl请求日志上使用它,因为我们所有的洪泛都是通过SSLPPerfect:)谢谢!有时值得排除一些状态和bot
cat access.log | grep-v-w 200 | grep-v-w 403 | grep-v-e'.jpg'| grep-v-i bot | awk'{print$1}| sort-n | uniq-c | sed-r's/[\t]*([0-9]+)(.*)$/\1-\2/';sort-nr | head 200