Marco Ceppi konusunda haklı awk
bunun için daha iyi bir araç olma ama awk da daha iyi bir araçtır sort
ve uniq
bu mantık ile hareket ettirilebilir beri awk
. Sadece 1000 satır kuyrukluyorsanız çok fazla bir fark yaratmaz, ancak büyük bir çoklu gig günlük dosyasına bakmak istiyorsanız, bunu taşımak için daha hızlı büyüklük siparişleri olabilir awk
.
cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
ihtiyacınız olanı yapar ancak büyük dosyalar için çok daha hızlıdır. IP adresini anahtar olarak kullanarak ve IP'lerin değer olarak kaç kez gerçekleştiğini awk olarak bir dizi IP oluşturur.
Hızlanma, awk'ın verilerin üzerinden geçmesi ve son çıktıyı sıralamak dışında işin çoğunu yapması nedeniyle gelir. Diğer yöntemi kullanarak, aktarım günlüğünde 1.000.000 satırınız varsa, awk 1.000.000 IP tüküren 1.000.000 satırı okur, ardından sıralama 1.000.000 IP'nin tamamını geçer ve sıralanan 1.000.000 IP'yi uniq'e gönderir ve bu da onu çok daha küçük bir değere indirir sıralamayı vermeden önce veri miktarı. Awk, 1.000.000 IP'de boru tesisatı yapmak / çoklu geçiş yapmak yerine, neredeyse her şeyi bir geçişte yapar.
Dizüstü bilgisayarımda 5.513.132 satır apache günlüğü (1.1 gig) kullanarak, bir hız karşılaştırması:
- 2m 45s
cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
- 0m 40s
cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n