Süper bir komut gördüm. Postfix loglarında şu gün ipler kaç defa bağlanmış sıralı gösteriyor.
cat /var/log/mail.log |awk ‘$0 ~ / connect from/ && $2 == “24” {split($NF, a, “[“);split(a[2], b, “]”); split($3, c, “:”); print b[1]” “$1” “$2” “c[1]”:”c[2];}’ |sort -n | uniq -c | sort -n
İlk başta karışık geliyor ama biraz parçalayınca netlik kazanmaya başlıyor.
cat /var/log/mail.log |
awk ‘
$0 ~ / connect from/ && $2 == “24”
{
split($NF, a, “[“);
split(a[2], b, “]”);
split($3, c, “:”);
print b[1]” “$1” “$2” “c[1]”:”c[2];
}’ |
sort -n | uniq -c | sort -n
Şimdi bir örnek olarak bir Postfix log unu alalım.
May 24 08:32:53 mailtake10 postfix/submission/smtpd[17798]: connect from 170.212.196.104.bc.googleusercontent.com[104.196.212.170]
Bu log üzerinden devam edeceğiz ama önce
$NF = Satırın son sütunu 170.212.196.104.bc.googleusercontent.com[104.196.212.170]
$0 Awk'ta tüm satır demektir.
~ işareti ise regex kullanacağım demektir.
/ connect from/ --> bu kısım sed de ki gibi / ve / arası bir regex bloktur.
Split özellik olarak verileni istenilen yerden böler diziye kaydeder ama ayıraç kaybolur.
split($NF, a, “[“) –> Son bloku al ve [ dan ayır a dizisine kaydet. Bu durumda
a[1] => 170.212.196.104.bc.googleusercontent.com
a[2] => 104.196.212.170]
olur
Yani yapılan işlemin yeniden okumak istersek
/var/log/maillog u dök |tüm satiri al regex olarak sunu ara VE $2nci sütun 24 olan i sec.
{
son sütunu [ dan itibaren böl ve a ya kaydet;
sonra a[2] yi ] dan itibaren böl ve b ye kaydet;
sonra ana satirin $3 ncü sütunun : dan itibaren böl c ye kaydet;
sonra yaz b[1] bosluk 1nci sütun bosluk 2nci sütun bosluk Cnin 1ncisi : Cnin 2ncisi
}
sonra sayısal olarak sırala
sonra her birinden kaç adet var say
sonra sayısal olarak sırala.
Çıktı gibi olacaktır.
65 104.196.212.170 May 24 08:32