2012-04-24 20 views
15

Powiedzmy, że mam miliony pakietów do przejrzenia i chcę zobaczyć, ile razy pakiet został wysłany na określony numer portu.Jak wydrukować liczbę unikalnych dopasowań za pomocą polecenia grep?

Oto niektóre z pakietów:

10:27:46.227407 IP 85.130.236.26.54156 > 139.91.133.120.60679: tcp 0 
10:27:46.337038 IP 211.142.173.14.80 > 139.91.138.125.56163: tcp 0 
10:27:46.511241 IP 211.49.224.217.3389 > 139.91.131.47.6973: tcp 0 

chcę patrzeć przez 2 numer portu tutaj tak:

60679, 53163, 6973, etc

Więc mogę używać:

grep -c '\.80:' output.txt 

Do zliczania wszystkich czasów użycia portu 80. Ale czy istnieje sposób, aby wyświetlić wszystkie porty, które były używane i ile razy został znaleziony w tym pliku. Coś takiego, a korzystna klasyfikowane zbyt więc mogę zobaczyć, które porty były używane najczęściej:

.80: - 54513 
.110: - 12334 
.445: - 412 

Odpowiedz

33

Zobacz uniq -c. Będziesz chciał wyciągnąć bit, który chcesz, posortuj wynik, potnij przez uniq, posortuj wyjście. Coś takiego może:

egrep '\.[0-9]+:' output.txt | sort | uniq -c | sort -nr 

Wyjaśnienie: Użyłem grep tutaj, ponieważ nie jest jasne, co Twój Format output.txt wygląda, ale będziemy chcieli faktycznie wyciąć kawałek numer portu, być może poprzez cut lub awk.

Edycja: Aby dostać się do portu, można wyciąć raz na czas, a następnie ponownie na dwukropkiem: (. Lub jednego z kilkunastu innych sposobów, aby osiągnąć to samo)

cut -d. -f10 < output.txt | cut -d: -f1 

które będą daje nieposortowaną listę portów. Następnie:

cut -d. -f10 < output.txt | cut -d: -f1 | sort | uniq -c | sort -nr 
+0

Dzięki za pomoc. Ale mam kłopot z cięciem. Czy istnieje sposób cięcia tylko za pomocą wyrażenia regularnego? Ponieważ numer portu nie znajduje się w tej samej kolumnie i ma odstępy za każdym razem. – Dragonfly

+0

Wytnij nie używa wyrażeń regularnych. Edytuj swoje pytanie i dodaj kilka przykładowych linii, abyśmy mogli zobaczyć format. –

+0

Ok I edytowałem to kilka przykładów. Co poleciłbyś wtedy użyć? – Dragonfly

Powiązane problemy