2013-04-13 16 views
73

sytuacja:

Mam duży plik (mln linii) zawierające adresy IP i porty z kilku godzinnym przechwytywania sieci, jedno IP/portów w wierszu. Linie są tego formatu:Bash Script: Liczba unikatowych linii w pliku

ip.ad.dre.ss[:port] 

Pożądany wynik:

Jest wpis dla każdego pakietu, jaką otrzymałem podczas logowania, więc istnieje wiele zduplikowanych adresów. Chciałbym być w stanie uruchomić ten skrypt powłoki poprzez pewnego rodzaju, która będzie w stanie zmniejszyć go do linii formatu

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

gdzie count jest liczba wystąpień tego konkretnego adresu (i portu). Nie trzeba wykonywać żadnych specjalnych zadań, traktuj różne porty jako różne adresy.

tej pory używam tego polecenia, aby zeskrobać wszystkie adresy IP z pliku dziennika:

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

od tego, czy mogę używać dość proste regex zeskrobać się wszystkie adresy IP które zostały wysłane przez mój adres (który nie dbam o)

można następnie użyć następujących wydobyć unikalne wpisy:

sort -u ips.txt > intermediate.txt 

nie wiem, w jaki sposób można agregować z linii C w jakiś sposób z sortowaniem.

Odpowiedz

196

Można użyć komendy uniq dostać liczy brakowanych powtarzanych linii:

sort ips.txt | uniq -c 

dostać najczęstsze wyniki w górę (dzięki Peter Jarić):

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

Follow-up: Używam tego dosłownie każdego dnia. Jak mogłem przetrwać bez tego. – Wug

+12

Przyszedłem tutaj, aby to zagłosować, ale już zostałem wybrany przeze mnie. – Worker

+11

Dodaj kolejny sortuj, aby uzyskać najbardziej popularne wyniki: "sort ips.txt | uniq -c | sort -bgr' –

Powiązane problemy