免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: send_linux
打印 上一主题 下一主题

[学习共享] 2013年ChinaUnix社区Shell编程大赛!(获奖名单公布)!  关闭 [复制链接]

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
61 [报告]
发表于 2013-06-20 14:39 |只看该作者
cyaln 发表于 2013-06-20 14:38
第一题
第二题
第三题


谢谢参与!

论坛徽章:
71
15-16赛季CBA联赛之同曦
日期:2018-08-23 15:41:42辰龙
日期:2014-08-15 09:07:43狮子座
日期:2014-06-03 13:55:33亥猪
日期:2014-06-02 11:17:08巨蟹座
日期:2014-05-06 10:02:03午马
日期:2014-05-04 08:18:27亥猪
日期:2014-04-29 11:11:32技术图书徽章
日期:2014-04-24 15:51:26技术图书徽章
日期:2014-04-17 11:01:53辰龙
日期:2014-04-15 12:45:46亥猪
日期:2014-04-11 09:06:23射手座
日期:2014-04-01 15:28:10
62 [报告]
发表于 2013-06-20 14:46 |只看该作者
本帖最后由 zhaopingzi 于 2013-06-25 12:53 编辑

1.

  1. grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' illegal.log|awk -F. '{a[$0]++}END{for(i in a)print i ,a[i]}'|sort -k2|tail -1
  2. 192.74.224.245 9
复制代码
3.

  1. #/bin/bash
  2. ips=`seq 3 100`
  3. for ip in $ips
  4. do

  5. dday=`date +"%y%m%d"`
  6. file=192.168.3.$ip-$dday.tar.bz2


  7. week=`date +%w`

  8. case $week in
  9.               7 )  ssh 192.168.3.$ip tar -g snapshot -zcf  backup_full.$file   --exclude=/opt/WebSphere/AppServer/profiles/bin --exclude=/opt/WebSphere/AppServer/profiles/log --exclude=*.log --exclude=*heapdump* --exclude=*.gz --exclude=*.tar --exclude=*.zip ==exclude=*.bak /opt/WebSphere/AppServer/profiles/
  10.                    scp  192.168.3.$ip:/backup_full.$file   /var/ChinaUnix/
  11.                    ;;
  12.     1|2|3|4|5|6 )  ssh 192.168.3.$ip tar -g snapshot -zcf  backup_incremental.$file   --exclude=/opt/WebSphere/AppServer/profiles/bin --exclude=/opt/WebSphere/AppServer/profiles/log --exclude=*.log --exclude=*heapdump* --exclude=*.gz --exclude=*.tar --exclude=*.zip ==exclude=*.bak /opt/WebSphere/AppServer/profiles/
  13.                    scp  192.168.1.$ip:/backup_incremental$file   /var/ChinaUnix/
  14.                    ;;
  15. esac

  16. done
复制代码
4.

  1.    第一种格式command命令正确执行返回0,第2种正确执行返回1
复制代码
5.

  1. echo "1234"|awk -F "" '{for(i=1;i<=NF;i++)SUM+=$i}END{print SUM}'
  2. 10
复制代码
6.

  1. #!/bin/bash

  2. echo "please input date(YYYY-MM-DD:)注意这个格式一定要输入对,程序没有判断输入有效性"
  3.      read ymd
  4.   year=`echo $ymd|awk -F"-" '{print $1}'`
  5.   mon=`echo $ymd|awk -F"-" '{print $2}'`
  6.   day=`echo $ymd|awk -F"-" '{print $3}'`

  7.   monnums=(0 31 28 31 30 31 30 31 31 30 31 30 31)

  8.     if(($year%400==0||($year%4==0&&$year%100!=0)))
  9.       then
  10.        leap=1;
  11.       else
  12.       leap=0;
  13.     fi
  14.         if((10#$mon>2))
  15.           then
  16.             for((i=0;i<10#$mon;i++))
  17.             {
  18.              x=`expr $x + ${monnums[$i]}`
  19.             }
  20.           total=`expr $x + $day + $leap`
  21.           else
  22.           for((i=0;i<10#$mon;i++))
  23.             {
  24.              x=`expr $x + ${monnums[$i]}`
  25.             }
  26.           total=`expr $x + $day`
  27.          fi


  28.    echo -e "this day is $total day of this year"

  29.   if(((10#$day<=31))&&((10#$day>1)))
  30.    then
  31.     day=$((10#$day-01))
  32.   fi

  33.   if((10#$day==1))&&(((10#$mon==5))||((10#$mon==7))||((10#$mon==8))||((10#$mon==10))||((10#$mon==12)))
  34.     then
  35.      mon=$((10#$mon-1))
  36.   fi

  37.   if(((10#$day==1)))&&(((10#$mon==2))||((10#$mon==4))||((10#$mon==6))||((10#$mon==9))||((10#$mon==11)))
  38.    then
  39.      day=31
  40.      mon=$((10#$mon-1))
  41.   fi

  42.   if((10#$day==1))&&((10#$mon==3))&&((leap==1))
  43.    then
  44.      day=29
  45.      mon=$((10#$mon-1))
  46.   fi

  47.   if((10#$day==1))&&((10#$mon==3))&&((leap==0))
  48.    then
  49.      day=28
  50.      mon=$((10#$mon-1))
  51.   fi

  52.   if((10#$day==1))&&((10#$mon==1))
  53.    then
  54.    year=$(($year-1))
  55.    mon=12
  56.    day=31
  57.   fi

  58. day=$((10#$day))
  59. year=$((10#$year))
  60. mon=$((10#$mon))

  61. printf "yesterday is "
  62. printf "%04d-" $year
  63. printf "%02d-" $mon
  64. printf "%02d\n" $day
复制代码
测试情况

  1. please input date(YYYY-MM-DD:)
  2. 2000-01-01
  3. this day is 1 day of this year
  4. yesterday is 1999-12-31

  5. please input date(YYYY-MM-DD:)
  6. 2008-09-09
  7. this day is 253 day of this year
  8. yesterday is 2008-09-08

  9. please input date(YYYY-MM-DD:)
  10. 2013-01-01
  11. this day is 1 day of this year
  12. yesterday is 2012-12-31

  13. please input date(YYYY-MM-DD:)
  14. 2000-03-01
  15. this day is 61 day of this year
  16. yesterday is 2000-02-29

  17. please input date(YYYY-MM-DD:)
  18. 2013-06-21
  19. this day is 172 day of this year
  20. yesterday is 2013-06-20
复制代码
8.

  1. 不可以
  2. rm认为是以空格隔开的多个文件呢
  3. 想要删除掉,把这个文件用""括起来
复制代码
10
用最简洁的命令列出当前目录下的非 20130605开头的文件

  1. ls|grep -v "^20130605"
复制代码

论坛徽章:
0
63 [报告]
发表于 2013-06-20 18:10 |只看该作者
第七题怎么砍掉了一个?算了半天才算出来。。。

论坛徽章:
0
64 [报告]
发表于 2013-06-20 18:14 |只看该作者
第四题   区别在于如果command1是真command2是假 则第一个表达式是执行command3  第二个不执行

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
65 [报告]
发表于 2013-06-21 06:22 来自手机 |只看该作者
没python不开心。

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
66 [报告]
发表于 2013-06-21 06:55 |只看该作者
gouxiongmao 发表于 2013-06-20 20:10
第七题怎么砍掉了一个?算了半天才算出来。。。

你如果已经完成的差不多的话,就贴上来,算附加分。

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
67 [报告]
发表于 2013-06-21 08:50 |只看该作者
ssfjhh 发表于 2013-06-21 06:22
没python不开心。


兄弟用的是啥客户端?
iOS的还是Android的啊?还是直接wap上的啊?

论坛徽章:
0
68 [报告]
发表于 2013-06-21 11:42 |只看该作者
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")}'  
############################################################

论坛徽章:
0
69 [报告]
发表于 2013-06-21 14:13 |只看该作者
本帖最后由 spzhangfei 于 2013-06-25 10:59 编辑

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" +"%b %d, %Y %r")
log_end_time=$(date -d"$end_time" +"%b %d, %Y %r")
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" '
{
        if($0~/^</)
        {
                if($0>="<"log_sta_time)
                {
                        tag=1
                }
                if($0> "<"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")}'  
############################################################

6、如果不考虑 GNU date (就是不带 -d 参数),
1. 如果给个日期 比如 2013-05-23,算出是这年的第几天。
2. 算出昨天日期
###########################################################
#!/bin/bash

a=$1    #从命令行接受日期如: ./date.sh "2013-05-23"
y=`echo $1|awk -F'-' '{print $1}'`
m=`echo $1|awk -F'-' '{print $2-1}'`
d=`echo $1|awk -F'-' '{print $3}'`

for i in `seq $m`
do
        if [ $i -eq 1 -o $i -eq 3 -o $i -eq 5 -o $i -eq 7 -o $i -eq 8 -o $i -eq 10 -o $i -eq 12 ]; then
                d_n=`expr $d_n + 31`
        elif [ $i -eq 2 ]; then
                two_n=`echo "$y"|awk 'num=$0%2?"28":"29"{print num}'`
                d_n=`expr $d_n + $two_n`
        else
                d_n=`expr $d_n + 30`
        fi
done

r_d=`expr $d_n + $d`
echo $r_d
--------------------------
#!/bin/bash

a=$1  #从命令行接受日期如: ./date.sh "2013-05-23"
y=`echo $1|awk -F'-' '{print $1}'`
m=`echo $1|awk -F'-' '{print $2}'`
d=`echo $1|awk -F'-' '{print $3}'`

if [ $d -eq 1 -a $m -eq 1 ]; then
        d_n=31
        m_n=12
        y_n=`expr $y - 1`
elif [ $d -eq 1 ]; then
        y_n=$y
        m_n=`expr $m - 1`
        if [ $m_n -eq 1 -o $m_n -eq 3 -o $m_n -eq 5 -o $m_n -eq 7 -o $m_n -eq 8 -o $m_n -eq 10 -o $m_n -eq 0 ]; then
                d_n=31
        elif [ $m_n -eq 2 ]; then
                d_n=`echo "$y"|awk 'a=$0%2?"28":"29"{print a}'`
        else
                d_n=30
        fi
else
        d_n=`expr $d - 1`
        m_n=$m
        y_n=$y
fi
echo "$y_n-$m_n-$d_n"
################################################################################

8、[bash]如果当前目录下存在文件名包含空格(space)的文件,rm *可以删除它吗?为什么?
################################################################################

    可以,以下是我的实验。
[root@mail11 test]# touch a\ b
[root@mail11 test]# ll
total 0
-rw-r--r-- 1 root root 0 Jun 21 14:33 a b
[root@mail11 test]# echo "aaaaaaaaaaaaaaaaaaaa" > a\ b
[root@mail11 test]# cat a\ b
aaaaaaaaaaaaaaaaaaaa
[root@mail11 test]# rm *
rm: remove regular file `a b'? y
[root@mail11 test]# ll
total 0
[root@mail11 test]#
################################################################################

论坛徽章:
0
70 [报告]
发表于 2013-06-21 17:10 |只看该作者
本帖最后由 dt2310 于 2013-06-24 08:55 编辑

第四题:
在command1 返回值异常时,两条表达都只执行command3
在command1 返回值正常时,command1 && command2 || command3 先执行command2 ,command2 返回异常时才执行command3,否则不执行command3,
而第二种表达式只执行command2



第五题
变量a为多位数字,
  1. #!/bin/env bash
  2. var1=123456789

  3. sun=0
  4. while [ $var1 -gt 0 ]
  5. do
  6.     tmp=$(($var1%10))
  7.     var1=$(($var1/10))
  8.     sun=$(($sun+$tmp))
  9. done
  10. echo $sun
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP