Situasi:
Saya memiliki file besar (jutaan baris) yang berisi alamat IP dan port dari tangkapan jaringan beberapa jam, satu ip / port per baris. Baris dari format ini:
ip.ad.dre.ss[:port]
Hasil yang diinginkan:
Ada entri untuk setiap paket yang saya terima saat masuk, jadi ada banyak alamat duplikat. Saya ingin dapat menjalankan ini melalui skrip shell dari beberapa jenis yang akan dapat menguranginya ke baris format
ip.ad.dre.ss[:port] count
di mana count
jumlah kemunculan alamat tertentu (dan port). Tidak ada pekerjaan khusus yang harus dilakukan, perlakukan port yang berbeda sebagai alamat yang berbeda.
Sejauh ini, saya menggunakan perintah ini untuk mengikis semua alamat ip dari file log:
grep -o -E [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(:[0-9]+)? ip_traffic-1.log > ips.txt
Dari sana, saya bisa menggunakan regex yang cukup sederhana untuk menghapus semua alamat ip yang dikirim oleh alamat saya (yang tidak saya pedulikan)
Saya kemudian dapat menggunakan yang berikut untuk mengekstrak entri unik:
sort -u ips.txt > intermediate.txt
Saya tidak tahu bagaimana saya bisa menggabungkan jumlah baris entah bagaimana dengan sortir.
-bgr
kebetulan terlihat seperti mnemonik untukbigger
, yang kami inginkan di atas..bashrc
atau.bash_aliases
berkas:function countuniquelines () { sort "$1" | uniq -c | sort -bgr; }
. Panggilan olehcountuniquelines myfile.txt
.sort -nr
.Untuk menghitung jumlah total garis unik (yaitu tidak mempertimbangkan garis duplikat) kita dapat menggunakan
uniq
atau Awk denganwc
:Array awk bersifat asosiatif sehingga dapat berjalan sedikit lebih cepat daripada menyortir.
Membuat file teks:
sumber
Ini adalah cara tercepat untuk mendapatkan hitungan garis yang diulang dan membuatnya dicetak dengan baik oleh yang paling jarang hingga paling sering:
Jika Anda tidak peduli dengan kinerja dan menginginkan sesuatu yang lebih mudah diingat, jalankan saja:
PS:
sort -n parsing bidang sebagai angka, itu benar karena kita menyortir menggunakan hitungan.
sumber
!
di{!seen[$0]++}
berlebihan di sini, karena kami hanya melakukan pencetakan diEND
.