Pytanie Bash Script: policz unikalne linie w pliku


Sytuacja:

Mam duży plik (miliony linii) zawierający adresy IP i porty z kilkugodzinnego przechwytywania sieci, jeden adres ip / port na linię. Linie są w tym formacie:

ip.ad.dre.ss[:port]

Pożądany rezultat:

Dla każdego pakietu, który otrzymałem podczas logowania, istnieje wpis, więc istnieje wiele zduplikowanych adresów. Chciałbym móc uruchomić to za pomocą jakiegoś skryptu powłoki, który będzie w stanie zmniejszyć go do linii formatu

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

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

Do tej pory używam tego polecenia, aby zeskanować 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

Z tego powodu mogę użyć dość prostego wyrażenia regularnego, aby zeskrobać wszystkie adresy IP wysłane przez mój adres (o co mnie nie interesuje)

Następnie mogę użyć następujących poleceń, aby wyodrębnić unikalne wpisy:

sort -u ips.txt > intermediate.txt

Nie wiem, w jaki sposób mogę zsumować liczbę linii z sortowaniem.


76
2018-04-13 04:57


pochodzenie




Odpowiedzi:


Możesz użyć uniq polecenie, aby uzyskać liczbę posortowanych powtarzających się linii:

sort ips.txt | uniq -c

Aby uzyskać najczęstsze wyniki na górze (dzięki Peter Jaric):

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

217
2018-04-13 05:04



Kontynuacja: teraz używam tego dosłownie każdego dnia. Jak mogłem przetrwać bez tego. - Wug
Przybyłem tutaj, aby go głosować, ale już zostałem wybrany przeze mnie. - Worker
Dodaj kolejny sortuj, aby uzyskać najbardziej popularne wyniki: sort ips.txt | uniq -c | sort -bgr - Peter Jaric
@PeterJaric: Dobra sugestia. Edytowałem to w. - Michael Hoffman
Lubię jak -bgr przypadkowo wygląda jak mnemonik dla bigger, czego chcemy na szczycie. - dwanderson