26/05/2019

Bash Split

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

Leave a Reply