1

我有包含 IP 列表的文件:

1.1.1.1
2.2.2.2
3.3.3.3
5.5.5.5
1.1.1.1
5.5.5.5

我想创建打印上述 IP 的计数器列表的文件,例如:

1.1.1.1: 2
2.2.2.2: 1
3.3.3.3: 1
5.5.5.5: 2

其中 2,1,1,2 是计数器。

我开始编写适用于最终计数 IP 和已知计数但不知道如何继续的脚本

 ./ff.sh file_with_IPs.txt

脚本

#!/bin/sh

file=$1

awk  '
BEGIN {
    for(x=0; x<4; ++x)
        count[x] = 0;

 ip[0] = "1.1.1.1";
 ip[1] = "2.2.2.2";
 ip[2] = "3.3.3.3";
 ip[3] = "5.5.5.5";    
}
{
    if($1==ip[0]){
       count[0] += 1;
     } else if($1==ip[1]){
       count[1] += 1;
     }else if($1==ip[2]){
       count[2] += 1;
     }else if($1==ip[3]){
       count[3] += 1;
     }
}
END {
    for(x=0; x<4; ++x) {
       print ip[x] ": " count[x]
    }
}
' $file > newfile.txt

我不知道文件中存储了多少 IP 以及它们的外观的主要问题。

ip因此,每次 awk 捕获新 IP 时,我都需要增加数组。

4

2 回答 2

4

我认为使用 awk 更容易sort -u,但是使用 awk 可以做到:

awk '{a[$0]++; next}END {for (i in a) print i": "a[i]}' file_with_IPs.txt

输出:

1.1.1.1: 2
3.3.3.3: 1
5.5.5.5: 2
2.2.2.2: 1

(在sudo_O 推荐给我的本教程的帮助下)

于 2013-04-22T08:30:25.880 回答
3

您可以uniq用于该任务,例如:

sort IPFILE | uniq -c

(注意,这会打印 IP 前面的事件。)

或者使用 awk(如果线路上只有 IP 地址):

awk '{ips[$0]++} END { for (k in ips) { print k, ips[k] } }' IPFILE

(注意,这会打印无序的 IP 地址,但您可以使用 awk 执行此操作、阅读文档、for asortasorti或只是sort在管道后附加 a。)

于 2013-04-22T08:30:12.030 回答