Марко Чеппі має рацію щодо awkтого, щоб бути кращим інструментом для цього, але awk - це також кращий інструмент, ніж sortі uniqоскільки ця логіка може бути перенесена на awk. Це не має великої різниці, якщо ви просто набираєте 1000 рядків, але якщо ви хочете подивитися на величезний файл журналу з декількома гігами, ви можете набирати його на порядок швидше awk.
cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -nзробить те, що потрібно, але набагато швидше для великих файлів. Він створює масив IP-адрес в awk, використовуючи IP-адресу в якості ключа, і кількість разів, коли IP-адреси виникають як значення.
Швидкість приходить, тому що awk передає дані і робить більшу частину роботи, за винятком сортування кінцевого результату. Використовуючи інший метод, якщо у журналі передачі є 1 000 000 рядків, awk зчитує ці 1 000 000 рядків, що виплюнують 1 000 000 IP-адрес, а потім сортування переходить усі 1000 000 IP-адрес, відправляючи відсортовані вже 1 000 000 IP-адрес до uniq, що зменшує його до значно меншого кількість даних перед тим, як надати їх для сортування. Замість того, щоб обробляти / робити кілька проходів на 1 000 000 IP-адрес, awk робить майже все за один прохід.
Використовуючи на своєму ноутбуці 5,513,132 лінійний журнал apache (1,1 гіга), ось порівняння швидкості:
- 2м 45с
cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
- 0м 40-х
cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n