Марко Чеппи прав в том, 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