1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| ============================================================================================= 显示连接的服务名或SID,以及连接过来的IP地址的次数统计脚本(由于监听日志中显示的service_name, sid等信息有位置上的差别,因而用正则表达式做了相关处理): --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也可能存在小写的情况。
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
|