迅速汇总 listener.log 里面信息的脚本

统计连接拒绝IP

1
2
3
tail -10000 listener.log | awk -F "Incoming connection from|rejected " '{print $2}'| sort | uniq -c | sort -nr

tail -10000 listener.log |grep Incoming|awk '{print $4}'| sort | uniq -c | sort -nr

HOST/Program/OSUser简版

按HOST/Program/OSUser汇总lister log最近 10000行的记录

1
2
3
echo "CNT     # PROGRAM@HOST[OSUSER]";tail -10000 listener.log | awk  -F"[()=]" '/establish/{
for(i=1;i<=NF;i++){if($i=="PROGRAM")pro=$(i+1);if($i=="HOST")host=$(i+1);if($i=="USER")usr=$(i+1);}cnt[pro"@"host"["usr"]"]++}
END{for(x in cnt)print cnt[x]"\t# "x}'|sort -nr

HOST简版:按HOST汇总lister log最近 10000行的记录

1
2
3
echo "CNT     # HOST";tail -10000 listener.log | awk  -F"[()=]" '/establish/{
for(i=1;i<=NF;i++){if($i=="HOST")host=$(i+1)}cnt[host]++}
END{for(x in cnt)print cnt[x]"\t# "x}'|sort -nr

PROGRAM简版:按HOST汇总lister log最近 10000行的记录

1
2
3
echo "CNT     # PROGRAM";tail -10000 listener.log | awk  -F"[()=]" '/establish/{
for(i=1;i<=NF;i++){if($i=="PROGRAM")pro=$(i+1)}cnt[pro]++}
END{for(x in cnt)print cnt[x]"\t# "x}'|sort -nr

PROGRAM@HOST简版: 按HOST汇总lister log最近 10000行的记录

1
2
3
echo "CNT     # PROGRAM@HOST";tail -10000 listener.log | awk  -F"[()=]" '/establish/{
for(i=1;i<=NF;i++){if($i=="PROGRAM")pro=$(i+1);if($i=="HOST")host=$(i+1)}cnt[pro"@"host]++}
END{for(x in cnt)print cnt[x]"\t# "x}'|sort -nr

HOST/Program/OSUser完整版(无排序):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
tail -10000 listener.log | awk  -F"[()=]" '/CONNECT_DATA/{
for(i=1;i<=NF;i++){
if($i=="PROGRAM")pro=$(i+1);
if($i=="HOST")host=$(i+1);
if($i=="USER")usr=$(i+1);
}
cnt[pro"@"host"["usr"]"]++;
cnt_usr[usr]++;
cnt_host[host]++;
cnt_pro[pro]++;
}
END{
print "\n+++++++++++By OSUser+++++++++++++";
print "CNT\t# OSUSER";
for(x in cnt_usr)print cnt_usr[x]"\t# "x
print "\n+++++++++++By Host+++++++++++++";
print "CNT\t# HOST";
for(x in cnt_host)print cnt_host[x]"\t# "x
print "\n+++++++++++By Program+++++++++++++";
print "CNT\t# PROGRAM";
for(x in cnt_pro)print cnt_pro[x]"\t# "x
print "\n+++++++++++By OSUSER/Host/Program+++++++++++++";
print "CNT\t# PROGRAM@HOST[OSUSER]";
for(x in cnt)print cnt[x]"\t# "x
}'

按照时间趋势汇总

时间趋势/Day: 按天汇总,按天排序

1
tail -10000 listener.log | awk '/establish/{c=substr($0,1,11);if(c!=f){n++;f=c};d[n"\t"c]++}END{for(x in d)print x"--- "d[x]}'|sort -n

按天汇总,按次数排序

1
tail -10000 listener.log | awk '/establish/{c=substr($0,1,11);d[c]++}END{for(x in d)print d[x]"\t"x}'|sort -nr

时间趋势/Hour:按小时汇总,按小时排序

1
tail -10000 listener.log | awk '/establish/{c=substr($0,1,14);if(c!=f){n++;f=c};d[n"\t"c]++}END{for(x in d)print x"--- "d[x]}'|sort -n

按小时汇总,按次数排序

1
tail -10000 listener.log | awk '/establish/{c=substr($0,1,14);d[c]++}END{for(x in d)print d[x]"\t"x":00"}'|sort -nr

时间趋势/10min:按10分钟汇总,按10分钟排序

1
tail -10000 listener.log | awk '/establish/{c=substr($0,1,16);if(c!=f){n++;f=c};d[n"\t"c"0"]++}END{for(x in d)print x"--- "d[x]}'|sort -n

按10分钟汇总,按次数排序

1
tail -10000 listener.log | awk '/establish/{c=substr($0,1,16);d[c]++}END{for(x in d)print d[x]"\t"x"0"}'|sort -nr

时间趋势/1min:按分钟汇总,按分钟排序

1
tail -10000 listener.log | awk '/establish/{c=substr($0,1,17);if(c!=f){n++;f=c};d[n"\t"c]++}END{for(x in d)print x"--- "d[x]}'|sort -n

按分钟汇总,按次数排序

1
tail -10000 listener.log | awk '/establish/{c=substr($0,1,17);d[c]++}END{for(x in d)print d[x]"\t"x}'|sort -nr

由于awk各发行版本特性不一,未必能完美支持。如果是UNIX系统程序不正确,考虑把awk换成nawk再看看。还是不行的话,反馈一下操作系统及awk版本。

显示连接的服务名或SID

显示连接的服务名或SID,以及连接过来的IP地址的次数统计脚本(由于监听日志中显示的service_name, sid等信息有位置上的差别,因而用正则表达式做了相关处理):

1
2
3
4
5
6
7
8
9
10
--AIX
cat listener.log | grep "01-JAN-2017 14:" |grep 'establish'| sed 's/service_name=/SERVICE_NAME=/g;s/sid=/SID=/g' | sed -n 's/^\([0-9]\{2\}-\{1\}[A-Z]\{3\}-\{1\}[0-9]\{4\}.\{1\}[0-9]\{2\}:\{1\}[0-9]\{2\}:\{1\}[0-9]\{2\}\)\(.\{1\}\*\{1\}.\{1\}\)\(.*(CONNECT_DATA=.*\)\((SERVICE_NAME=[A-Z0-9a-z.-_+]*)\{1\}\).*\(.\{1\}\*\{1\}.\{1\}\).*\((HOST=[0-9]\{1,3\}[.]\{1\}[0-9]\{1,3\}[.]\{1\}[0-9]\{1,3\}[.]\{1\}[0-9]\{1,3\})\{1\}\).*/ , \4 , \6 /p;s/^\([0-9]\{2\}-\{1\}[A-Z]\{3\}-\{1\}[0-9]\{4\}.\{1\}[0-9]\{2\}:\{1\}[0-9]\{2\}:\{1\}[0-9]\{2\}\)\(.\{1\}\*\{1\}.\{1\}\)\(.*(CONNECT_DATA=.*\)\((SID=[A-Z0-9a-z.-_]*)\{1\}\).*\(.\{1\}\*\{1\}.\{1\}\).*\((HOST=[0-9]\{1,3\}[.]\{1\}[0-9]\{1,3\}[.]\{1\}[0-9]\{1,3\}[.]\{1\}[0-9]\{1,3\})\{1\}\).*/ , \4 , \6 , /p' | sort | uniq -c | sort -k3 -k2 -t ',' | awk -F ',' '{printf "%-10d ,%-50s ,%-30s\n", $1, $2, $3}'
--LINUX
echo "CNT # SID/SERVICE_NAME # HOST";tail -10000 listener.log | awk -F"[()=]" '/establish/{
for(i=1;i<=NF;i++){
if($i=="SID" || $i=="sid" )sid="SID="$(i+1)"\t";
if($i=="SERVICE_NAME" || $i=="service_name" )sid="SERVICE_NAME="$(i+1);
if($i=="HOST")host=$(i+1);
}cnt[sid"\t# "host]++
}END{for(x in cnt)print cnt[x]"\t# "x}'|sort -nr

假如其中在某一行 SID/SERVICE_NAME不存在,值会自动按上一行的来显示。所以,在每行处理前,需要把相关值给清空才行。
另外service_name也可能存在小写的情况。

1
awk  -F"[()=]" 'BEGIN{IGNORECASE=1} /establish/ {for(i=1;i<=NF;i++){if($i=="PROGRAM")pro=$(i+1);if($i=="HOST")host=$(i+1);if($i=="USER")usr=$(i+1);if($i=="SID")sev=$(i+1);if($i=="SERVICE_NAME")sev=$(i+1)}cnt[host"|"usr"|"sev"|"pro]++;host=null;usr=null;sev=null;pro=null}END{for(x in cnt)print x"|"cnt[x]}' listener.log|sort

原文作者: liups.com

原文链接: http://liups.cn/posts/6247928e/

许可协议: 知识共享署名-非商业性使用 4.0 国际许可协议