Saya memiliki file log yang diurutkan berdasarkan alamat IP, saya ingin mencari jumlah kemunculan setiap alamat IP yang unik. Bagaimana saya bisa melakukan ini dengan bash? Kemungkinan daftar jumlah kejadian di sebelah IP, seperti:
5.135.134.16 count: 5
13.57.220.172: count 30
18.206.226 count:2
dan seterusnya.
Berikut contoh log:
5.135.134.16 - - [23/Mar/2019:08:42:54 -0400] "GET /wp-login.php HTTP/1.1" 200 2988 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
5.135.134.16 - - [23/Mar/2019:08:42:55 -0400] "GET /wp-login.php HTTP/1.1" 200 2988 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
5.135.134.16 - - [23/Mar/2019:08:42:55 -0400] "POST /wp-login.php HTTP/1.1" 200 3836 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
5.135.134.16 - - [23/Mar/2019:08:42:55 -0400] "POST /wp-login.php HTTP/1.1" 200 3988 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
5.135.134.16 - - [23/Mar/2019:08:42:56 -0400] "POST /xmlrpc.php HTTP/1.1" 200 413 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
13.57.220.172 - - [23/Mar/2019:11:01:05 -0400] "GET /wp-login.php HTTP/1.1" 200 2988 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
13.57.220.172 - - [23/Mar/2019:11:01:06 -0400] "POST /wp-login.php HTTP/1.1" 200 3985 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
13.57.220.172 - - [23/Mar/2019:11:01:07 -0400] "GET /wp-login.php HTTP/1.1" 200 2988 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
13.57.220.172 - - [23/Mar/2019:11:01:08 -0400] "POST /wp-login.php HTTP/1.1" 200 3833 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
13.57.220.172 - - [23/Mar/2019:11:01:09 -0400] "GET /wp-login.php HTTP/1.1" 200 2988 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
13.57.220.172 - - [23/Mar/2019:11:01:11 -0400] "POST /wp-login.php HTTP/1.1" 200 3836 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
13.57.220.172 - - [23/Mar/2019:11:01:12 -0400] "GET /wp-login.php HTTP/1.1" 200 2988 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
13.57.220.172 - - [23/Mar/2019:11:01:15 -0400] "POST /wp-login.php HTTP/1.1" 200 3837 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
13.57.220.172 - - [23/Mar/2019:11:01:17 -0400] "POST /xmlrpc.php HTTP/1.1" 200 413 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
13.57.233.99 - - [23/Mar/2019:04:17:45 -0400] "GET / HTTP/1.1" 200 25160 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
18.206.226.75 - - [23/Mar/2019:21:58:07 -0400] "GET /wp-login.php HTTP/1.1" 200 2988 "https://www.google.com/url?3a622303df89920683e4421b2cf28977" "Mozilla/5.0 (Windows NT 6.2; rv:33.0) Gecko/20100101 Firefox/33.0"
18.206.226.75 - - [23/Mar/2019:21:58:07 -0400] "POST /wp-login.php HTTP/1.1" 200 3988 "https://www.google.com/url?3a622303df89920683e4421b2cf28977" "Mozilla/5.0 (Windows NT 6.2; rv:33.0) Gecko/20100101 Firefox/33.0"
18.213.10.181 - - [23/Mar/2019:14:45:42 -0400] "GET /wp-login.php HTTP/1.1" 200 2988 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
18.213.10.181 - - [23/Mar/2019:14:45:42 -0400] "GET /wp-login.php HTTP/1.1" 200 2988 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
18.213.10.181 - - [23/Mar/2019:14:45:42 -0400] "GET /wp-login.php HTTP/1.1" 200 2988 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
command-line
bash
sort
uniq
j0h
sumber
sumber
sort -V
meskipun saya pikir itu tidak diperlukan. Saya mengirim 10 pelaku penyalahgunaan halaman login ke admin sistem dengan rekomendasi untuk melarang subnet masing-masing. misalnya, One IP mencapai halaman login lebih dari 9000 kali. IP, & subnet kelas D-nya sekarang masuk daftar hitam. Saya yakin kami bisa mengotomatisasi ini, meskipun itu adalah pertanyaan yang berbeda.Jawaban:
Anda dapat menggunakan
grep
danuniq
untuk daftar alamat, mengulanginya dangrep
kembali menghitung:grep -o '^[^ ]*'
menampilkan setiap karakter dari awal (^
) hingga spasi pertama dari setiap baris,uniq
menghilangkan baris yang diulang, sehingga meninggalkan Anda dengan daftar alamat IP. Berkat substitusi perintah,for
loop loop atas daftar ini mencetak IP yang sedang diproses diikuti oleh "menghitung" dan menghitung. Yang terakhir dihitung dengangrep -c
, yang menghitung jumlah garis dengan setidaknya satu kecocokan.Contoh dijalankan
sumber
uniq -c
atauawk
hanya perlu membaca file sekali,<log grep ...
dan tidakgrep ... log
?Anda dapat menggunakan
cut
danuniq
alat:Penjelasan:
cut -d ' ' -f1
: ekstrak bidang pertama (alamat ip)uniq -c
: laporkan baris yang berulang dan tampilkan jumlah kemunculannyasumber
sed
, misalnyased -E 's/ *(\S*) *(\S*)/\2 count: \1/'
untuk mendapatkan output persis seperti yang diinginkan OP.sort file | cut ....
jika Anda tidak yakin apakah file tersebut sudah diurutkan.Jika Anda tidak secara khusus memerlukan format output yang diberikan, maka saya akan merekomendasikan jawaban yang sudah diposting
cut
+uniq
berbasisJika Anda benar - benar membutuhkan format output yang diberikan, cara single-pass untuk melakukannya dalam Awk adalah
Ini agak tidak ideal ketika input sudah disortir karena tidak perlu menyimpan semua IP ke dalam memori - cara yang lebih baik, meskipun lebih rumit, untuk melakukannya dalam case pra-sortir (lebih langsung setara dengan
uniq -c
) adalah:Ex.
sumber
Inilah salah satu solusi yang mungkin:
file.log
dengan nama file yang sebenarnya.$(awk '{print $1}' "$IN_FILE" | sort -u)
akan memberikan daftar nilai unik dari kolom pertama.grep -c
akan menghitung masing-masing nilai ini di dalam file.sumber
printf
...Beberapa Perl:
Ini adalah ide yang sama dengan pendekatan awk Steeldriver , tetapi dalam Perl. The
-a
penyebab perl untuk secara otomatis membagi setiap baris masukan ke dalam array@F
, yang pertama elemen (IP) adalah$F[0]
. Jadi,$k{$F[0]}++
akan membuat hash%k
, yang kuncinya adalah IP dan yang nilainya berapa kali setiap IP terlihat. The}{
adalah perlspeak funky "melakukan sisanya di akhir, setelah pengolahan semua masukan". Jadi, pada akhirnya, skrip akan beralih pada kunci hash dan mencetak kunci saat ini ($_
) bersama dengan nilainya ($k{$_}
).Dan, supaya orang tidak berpikir perl memaksa Anda untuk menulis skrip yang terlihat seperti coretan samar, ini adalah hal yang sama dalam bentuk yang kurang kental:
sumber
Mungkin ini bukan yang diinginkan OP; namun, jika kita tahu bahwa panjang alamat IP akan dibatasi hingga 15 karakter, cara yang lebih cepat untuk menampilkan jumlah dengan IP unik dari file log besar dapat dicapai menggunakan
uniq
perintah saja:Pilihan:
-w N
membandingkan tidak lebih dariN
karakter dalam baris-c
akan mengawali garis dengan jumlah kemunculanAtau, Untuk output yang diformat dengan tepat saya lebih suka
awk
(juga harus bekerja untuk alamat IPV6), ymmv.Catatan yang
uniq
tidak akan mendeteksi baris berulang di file input jika mereka tidak berdekatan, jadi mungkin perlu untuksort
file tersebut.sumber
FWIW, Python 3:
Keluaran:
sumber
Penjelasan: Ambil bidang pertama dari pemisahan my.log pada tanda hubung
-
dan urutkan.uniq
membutuhkan input yang diurutkan.-c
mengatakannya untuk menghitung kejadian.sumber