Mam plik w następującym formacie:
$ cat file.txt
27.33.65.2
27.33.65.2
58.161.137.7
121.50.198.5
184.173.187.1
184.173.187.1
184.173.187.1
Jaki jest najlepszy sposób na parsowanie pliku file.txt
do formatu takiego jak:
27.33.65.2: 2
58.161.137.7: 1
121.50.198.5: 1
184.173.187.1: 3
Innymi słowy, chcę przejrzeć plik i policzyć, ile razy pojawia się każdy adres IP. Już go uruchomiłem, sort
więc wszystkie adresy IP są w porządku i bezpośrednio po sobie.
Odpowiedzi:
Szukasz
uniq -c
Jeśli wynik tego nie przypadnie Ci do gustu, możesz go łatwo przeanalizować i sformatować.
Na przykład:
źródło
uniq
iawk
nie wydaje się być dla mnie świetnym podejściem ...uniq
działa tylko na posortowane dane wejściowe (pasuje do sąsiednich pasujących linii, a nie do żadnych linii z pliku).sort
!uniq
wydaje się rzeczywiście najsprytniejszym rozwiązaniem. Awk sposób:źródło
sort
do mojej odpowiedzi jest jeszcze szybsze, ponieważ trzeba posortować mniej elementów. ;-)plik sortowania Firest, a następnie licznik unic -c
sort filename | uniq -c
źródło
uniq -c
działałby, ale zapewniałby wyjście w niewłaściwym formacie. Dlatego przyjęta odpowiedź nie używa,sort
a zamiast tego ponownie formatuje wyjścieuniq -c
.Chciałbym użyć Pythona. Każdy system Linux ma obecnie zainstalowany Python2.
Dodaj każdy adres IP do słownika (tablicy asocjacyjnej) jako pary klucz = wartość, tj. {"12.34.56.78": 1, "87.76.43.21": 3}.
„Weryfikujesz” adres IP jako klucz i zwiększasz wartość o 1. Jeśli użyjesz defaultdict („ip”), jeśli klucz nie istnieje, zostanie utworzony z wartością domyślną 0. Jeśli klucz istnieje już defaultdict nic nie robi. Wartość jest zwiększana w następnym wierszu.
plik wyjściowy:
Wiem, że szukałeś rozwiązania z linii poleceń, ale jak widać jest to elegancko sformatowany wyświetlacz, który zajął tylko kilkanaście linii. Python jest doskonałym narzędziem do administracji.
źródło