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