2013-04-22 85 views
1

我有文件,其中包含IP地址的列表:如何用'awk'动态增加数组?

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 

我,我不”的主要问题t知道存储在文件中的IP数量以及它们的外观。

所以我需要增加数组ip每当awk捕获新的IP。

+2

您是否考虑过使用'uniq'?或者有什么理由想要保持awk? – leijon 2013-04-22 08:25:27

+0

我运行的文件和文件列表中不仅包含ips(其他垃圾)。使用'awk',我可以将ip作为值 – 2013-04-22 08:30:16

+0

,但是如果您知道如何使用'uniq',您可以发布您的答案。 – 2013-04-22 08:31:00

回答

3

我认为这是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 

(有一点点帮助this tutorialsudo_O recommended me

+0

“下一个”在这里没有必要。 – Kent 2013-04-22 08:37:45

+0

Uhms,我明白了 - 因为在END之前我们没有执行任何其他操作,所以本声明无论如何都会转到下一个记录。我会像现在这样离开它,不要像Zsolt那样得到确切的答案。无论如何,谢谢你让我现在,@Kent。 – fedorqui 2013-04-22 08:43:00

3

您可以使用uniq该任务,如:

sort IPFILE | uniq -c 

(注意,这个打印出现在IP前)

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

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

(注意,这个打印的IP地址无序的,但你可以使用awk做到这一点,阅读文档,为asortasorti ,或者简单地在管道后附加sort。 )

+0

看到我们在同一时刻编码几乎相同,这很有趣。只是改变了变量的名字! – fedorqui 2013-04-22 08:35:38