Marco Ceppi ma rację, mówiąc, awkże jest lepszym narzędziem do tego, ale awk jest również lepszym narzędziem niż sorti uniqod 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 -nzrobi 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