- 论坛徽章:
- 0
|
1、有一小撮别有用心的人,他们会想办法获取论坛的用户名列表,然后用弱密码逐个尝试每一个用户名。针对这一情况,论坛程序会把每一次登陆失败
的记录放在日志里面。请编写脚本找出尝试登陆失败次数最多的 top 10 的IP地址和登陆失败次数。测试数据见附件illegal.log
##############################################
#!/bin/bash
cat illegal.log |awk '{print $NF}' | awk '{sum[$0]++}END{for(i in sum){print i,sum}}'|sort -n -k2|tail -10
##############################################
2、请编写脚本监控日志文件中的关键字<Error>,一旦发现该关键字就马上发邮件给admin@ChinaUnix.net,样例数据见附件wls_ms1.out,要求如下:
(1)假设该脚本在crontab中每10分钟执行一次,每次运行时只检测最近十分钟之内的日志里面有没有出现关键字,十分钟之前的日志不要误报。
(2)样例数据仅供参考,实际日志文件比较大(比如1GB),请充分考虑代码效率。
(3)应用程序会实时地更新这个日志文件,因此不允许对该文件进行分割。
##########################################
#!/bin/bash
stat_time=$(date -d"10 minutes ago" +"%F %H:%M:%S")
sta_time=$(date -d"$stat_time $(($(date -d "$stat_time" "+%M")%10)) minutes ago" +"%F %H:%M:00")
end_time=$(date -d "$sta_time 9 minutes" +"%F %H:%M:59")
log_sta_time=$(date -d"$sta_time" +"%y%m%d %H:%M:%S")
log_end_time=$(date -d"$end_time" +"%y%m%d %H:%M:%S")
echo $sta_time
echo $end_time
echo $log_sta_time
echo $log_end_time
cat filename.log|awk -v log_sta_time="$log_sta_time" -v log_end_time="$log_end_time" '
BEGIN{
gsub(/ 0/," ",log_sta_time)
gsub(/ 0/," ",log_end_time)
}
{
if($0~/^# Time: 1/)
{
if($0>="# Time: "log_sta_time)
{
tag=1
}
if($0> "# Time: "log_end_time)
{
exit
}
}
}tag' |awk '
BEGIN{
IGNORECASE=1
}
{
if($0~/Error/)
{
sum++
}
}
END{
if(sum>0)
{
system("echo \"日志文件出现错误"sum"次\"|mail -s \"时间 '$sta_time' admin@ChinaUnix.net\"")
}
}'
###########################################################
4、下面的两种表达有何不同:
command1 && command2 || command3
if command1
then
command2
else
command3
fi
##########################################################
第一个表示:当command1为真时,执行command2,执行command2后为假时,才会执行command3
第二个表示:当command1为真时,执行command2,当command1为假时,才会执行command3
##########################################################
5、给出一个多位数,算出其每位数的总和。比如 1234, 得到 10
############################################################
方法一、echo "1234"|awk '{for(i=1;i<=length($0);i++){num+=substr($0,i,1)}}END{print num}'
方法二、echo "1234"|sed -r ':a;s/([0-9])([0-9])/\1+\2/;ta'
方法三、echo "1234"|sed 's/./&+/g'|awk '{system("echo \47"$0"0\47|bc -l")}'
############################################################ |
|