Marco Ceppi benar tentang awk
menjadi alat yang lebih baik untuk ini tetapi awk juga merupakan alat yang lebih baik daripada sort
dan uniq
karena logika itu dapat dipindahkan ke awk
. Ini tidak membuat banyak perbedaan jika Anda hanya mengekor 1000 baris tetapi jika Anda ingin melihat file log multi-manggung besar itu bisa menjadi urutan besarnya lebih cepat untuk memindahkannya ke awk
.
cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
akan melakukan apa yang Anda butuhkan tetapi jauh lebih cepat untuk file besar. Itu menciptakan array IP di awk, menggunakan alamat IP sebagai kunci dan berapa kali IP terjadi sebagai nilai.
Percepatan datang karena awk melakukan satu melewati data dan melakukan sebagian besar pekerjaan, kecuali untuk menyortir hasil akhir. Menggunakan metode lain, jika Anda memiliki 1.000.000 baris dalam log transfer, awk membaca 1.000.000 baris yang mengeluarkan 1.000.000 IP, kemudian mengurutkan seluruh 1.000.000 IP, mengirimkan 1.000.000 IP yang sekarang disortir ke uniq yang menguranginya menjadi jauh lebih kecil jumlah data sebelum memberikan itu untuk disortir. Alih-alih memutar / melakukan beberapa lintasan pada 1.000.000 IP, awk melakukan hampir semua hal dalam satu lintasan.
Menggunakan 5.513.132 garis apache log (1.1 gigs) di laptop saya, inilah perbandingan kecepatannya:
- 2 m 45-an
cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
- 0 m 40-an
cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n