2013-04-13 150 views
73

現狀:

我有一個大的文件(百萬行),從幾個小時的網絡捕獲包含IP地址和端口,每行一個IP /端口。線條是這種格式:bash腳本:統計唯一行文件

ip.ad.dre.ss[:port] 

期望的結果:

沒有爲我在登錄時收到的每個數據包的條目,所以有很多重複的地址。我希望能夠通過某種類型的shell腳本,將能夠將其降低到格式

ip.ad.dre.ss[:port] count 

其中count線運行,這是該特定地址的出現(和端口號)。不需要做特別的工作,將不同的端口視爲不同的地址。

到目前爲止,我使用這個命令來湊所有從日誌文件中的IP地址:

grep -o -E [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(:[0-9]+)? ip_traffic-1.log > ips.txt 

從這一點,我可以用一個相當簡單的正則表達式來刮掉所有的IP地址這是由我的地址發送的(我不在乎)

然後我就可以使用以下方法來提取唯一條目:

sort -u ips.txt > intermediate.txt 

我不知道我怎麼能聚集線c以某種方式排序。

回答

196

可以使用uniq命令得到有序重複的行數:

sort ips.txt | uniq -c 

要獲得在頂部(感謝Peter賈裏奇)最常見的結果:

sort ips.txt | uniq -c | sort -bgr 
+27

後續:我現在每天都用這個字面。沒有它,我如何生存下去。 – Wug

+12

我來這裏投票了,但它已經被我投票了。 – Worker

+11

添加另一種排序以獲得最常見的結果:'sort ips.txt | uniq -c | sort -bgr' –