Marco Ceppi ma rację, mówiąc, awk
że jest lepszym narzędziem do tego, ale awk jest również lepszym narzędziem niż sort
i uniq
od kiedy można wprowadzić tę logikę awk
. Nie robi to wielkiej różnicy, jeśli po prostu dostosowujesz 1000 linii, ale jeśli chcesz spojrzeć na ogromny plik dziennika z wieloma koncertami, może być szybszy o kilka rzędów wielkości awk
.
cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
zrobi to, czego potrzebujesz, ale w przypadku dużych plików jest znacznie szybszy. Tworzy tablicę adresów IP w awk, używając adresu IP jako klucza i liczby wystąpień adresów IP jako wartości.
Przyspieszenie przychodzi, ponieważ awk wykonuje jedno przejście przez dane i wykonuje większość pracy, z wyjątkiem sortowania końcowego wyniku. Używając drugiej metody, jeśli masz 1 000 000 linii w dzienniku przesyłania, awk odczytuje 1 000 000 linii wyrzucających 1 000 000 adresów IP, następnie sortowanie przechodzi przez całe 1 000 000 adresów IP, wysyłając teraz posortowane 1 000 000 adresów IP do uniq, co zmniejsza je do znacznie mniejszej ilość danych przed sortowaniem. Zamiast przesyłać wokół / wykonywać wiele przejść dla 1 000 000 adresów IP, awk robi prawie wszystko za jednym przejściem.
Korzystając z 5513,132 dziennika apache linii (1,1 koncertów) na moim laptopie, oto porównanie prędkości:
- 2m 45s
cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
- 0m 40s
cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n