Marco Ceppi đã đúng awk
khi trở thành một công cụ tốt hơn cho việc này nhưng awk cũng là một công cụ tốt hơn sort
và uniq
vì logic đó có thể được chuyển sang awk
. Sẽ không có nhiều sự khác biệt nếu bạn chỉ theo dõi 1000 dòng nhưng nếu bạn muốn xem một tệp nhật ký nhiều gig, nó có thể là các đơn đặt hàng có cường độ nhanh hơn để chuyển nó vào awk
.
cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
sẽ làm những gì bạn cần nhưng nhanh hơn nhiều cho các tệp lớn. Nó tạo ra một mảng IP trong awk, sử dụng địa chỉ IP làm khóa và số lần IP xuất hiện làm giá trị.
Việc tăng tốc xuất hiện bởi vì awk thực hiện chuyển dữ liệu và thực hiện hầu hết công việc, ngoại trừ việc sắp xếp đầu ra cuối cùng. Sử dụng phương pháp khác, nếu bạn có 1.000.000 dòng trong nhật ký chuyển, awk sẽ đọc 1.000.000 dòng đó phun ra 1.000.000 IP, sau đó sắp xếp trên toàn bộ 1.000.000 IP, gửi 1.000.000 IP được sắp xếp tới uniq để giảm xuống còn nhỏ hơn nhiều số lượng dữ liệu trước khi đưa ra để sắp xếp. Thay vì đi vòng quanh / thực hiện nhiều lượt trên 1.000.000 IP, awk thực hiện hầu hết mọi thứ trong một lượt.
Sử dụng nhật ký apache dòng 5,513,132 (1,1 hợp đồng biểu diễn) trên máy tính xách tay của tôi, đây là so sánh tốc độ:
- 2m 45s
cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
- 0m 40
cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n