Unix按列整数过滤

时间:2015-12-15 10:18:41

标签: linux bash sorting unix awk

我正在尝试阻止有多个端口25连接(垃圾邮件)的IP

我有以下命令:

netstat -an|grep :25| awk {'print $4'} | cut -d: -f1 | sort | uniq -c | sort -n

产生如下输出:

      1
  1 127.0.0.1
  2 185.11.11.11
  10 185.11.11.22
  20 185.11.11.33
  50 185.11.11.44

我想只过滤第一列大于15的行。

谢谢

5 个答案:

答案 0 :(得分:5)

如果您不需要连接总数而只需要IP列表,则此行将执行:

netstat -an | awk '$4~/:25/{gsub(":25","",$4); s[$4]++; if(s[$4]==15){print $4}}'

$4~/:25/过滤包含':25' (相当于你队伍中的grep)

gsub(":25","",$4)从IP地址(字段4)中删除端口号

s[$4]++增加了给定IP的计数器

如果计数等于15,则

if(s[$4]==15){print $4}打印IP

答案 1 :(得分:1)

netstat -an | awk 'BEGIN { PROCINFO["sorted_in"] = "@val_num_desc" } $4 ~ /:25$/ && split($4, a, ":") == 2 { seen[a[1]]++ } END { for (i in seen) if (seen[i] > 15) print seen[i], i }' 可以处理大部分事情,因此可以避免这么多管道命令。您可以使用单个gnu-awk命令消除所有命令,如下所示:

PROCINFO["sorted_in"] = "@val_num_desc"  # used for sorting an array by value
                                         # in numerical descending order
split                                    # used to get IP address by discarding port num
$4 ~ /:25$/                              # to search a particular port in netstat output                     

解体:

public static void MsgToCode(string value)
{

    byte[] bytes = System.Text.Encoding.UTF8.GetBytes(value);
    var sb = new StringBuilder();
    foreach (var item in bytes)
    {
        sb.Append((Convert.ToInt32(item) + 2));
    }
    Console.WriteLine(sb.ToString());
    Console.ReadLine();
}

答案 2 :(得分:0)

只需使用awk'$ 1> 15'追加管道:

netstat -an|grep :25| awk {'print $4'} | cut -d: -f1 | sort | uniq -c | sort -n | awk '$1>15'

答案 3 :(得分:0)

又一个答案。

netstat -nat | awk -F'[ :]+' '
    BEGIN{PROCINFO["sorted_in"] = "@val_num_desc"}
    $5 == "25" {count[$4]++}
    END{
        for (ip in count)
            if (count[ip]>15)
                print count[ip], ip
    }
'

答案 4 :(得分:0)

命令netstat -an | head -n 4在此处生成此输出:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:715             0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:2137          0.0.0.0:*               LISTEN  

这意味着第4个字段是“Local Adress”。我假设你想要的是“外国地址”(字段#5)列表。

此外,您显示的是版本4的IP地址。可能netstat -4an对您来说效果更好。 IPv6地址应具有可变数量的:

清除这两个问题后,awk本身可以(几乎)完成所有工作:

netstat -4an | 
awk ' $5 ~ /:25/ {split($5,a,/:/); c[a[1]]++;}
      END{ for (ip in c) { if (c[ip] > 15) print(c[ip],ip) }; }
    '|sort -n