Марко Чеппи прав в том, 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-адресов, а затем сортирует по всем 1 000 000 IP-адресам, отправляя теперь отсортированные 1 000 000 IP-адресов в uniq, что сокращает его до гораздо меньшего количество данных, прежде чем дать, чтобы отсортировать. Вместо того, чтобы обойти / сделать несколько проходов на 1 000 000 IP-адресов, awk делает почти все за один проход.
Используя 5 513 132 строки в Apache Log (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