Марко Чеппі має рацію щодо 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