免费注册 查看新帖 |

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
11 [报告]
发表于 2013-06-18 14:23 |只看该作者
expert1 发表于 2013-06-18 14:19
好题目啊。


欢迎多多参与!

论坛徽章:
13
丑牛
日期:2013-08-16 15:08:22技术图书徽章
日期:2013-11-26 10:13:40双鱼座
日期:2013-11-08 15:03:26戌狗
日期:2013-11-08 13:52:30技术图书徽章
日期:2013-11-05 14:06:30戌狗
日期:2013-10-31 11:45:42CU十二周年纪念徽章
日期:2013-10-24 15:41:34天秤座
日期:2013-10-11 14:55:08子鼠
日期:2013-09-26 19:36:35水瓶座
日期:2013-09-26 17:44:56午马
日期:2013-08-26 10:24:23丑牛
日期:2013-08-19 14:43:22
12 [报告]
发表于 2013-06-18 14:47 |只看该作者
本帖最后由 代号:军刀 于 2013-06-19 16:29 编辑

第一题
  1. awk '{a[$NF]++}END{for(i in a)print i,a[i]}' illegal.log | sort -nrk +2 |head -10
复制代码
第二题
  1. #!/bin/bash

  2. date1=$(expr `date +%s` - 600)   #10分钟前时间戳

  3. sed -n -r 's/^<(.*EST)>.*/\1/p' wls_ms1.out | while read line
  4. do
  5.         a=$(date -d "$line" +%s) ###获得日志表中的时间戳
  6.         if [ "$a" -gt "$date1" ];then
  7.                 [ -n "$(sed -n "/$line/,\$p" wls_ms1.out | grep Error)" ] && echo "find Error"| mail -s "Error" admin@ChinaUnix.net
  8.                 break;
  9.         fi;
  10. done
复制代码
第四题
  1. command1 && command2 || command3
  2. 这条命令当command1和command2中任意一个不为真的时候就会执行command3
  3. if command1
  4. then
  5.   command2
  6. else
  7.   command3
  8. fi
  9. 这里如果command1为真,那么就执行command2,如果command1为假,就执行command3
复制代码
第五题
  1. awk -F "" '{for(i=1;i<=NF;i++){s+=$i}}END{print s}'
复制代码
第六题
  1. #!/bin/bash
  2. date0=$(date +%s)
  3. date1=$(echo $(date -s '20130523' && date +%s) | awk '{print $NF}')
  4. date2=$(echo $(date -s '20130101' && date +%s) | awk '{print $NF}')
  5. k=$(echo "($date1 - $date2) / (60 * 60 * 24)" | bc)
  6. echo 2013-05-23是这年的第$k天

  7. echo "昨天的日期是"
  8. echo "$date0 - (60 * 60 * 24)" | bc | awk '{print strftime("%F",$0)}'
复制代码
第八题
  1. 不可以,因为rm会把这些含有空格文件当成两部分处理。正确的做法是:
  2. ls * | xargs -I {} rm -f {}
复制代码
第十题
  1. 1.ls 2013060[^5]*
  2. 2.find . -type f -name "*.*" | while read name;do mv "$name" "`echo $name|sed -r 's/[ ]+//g'`";done
  3. 3. ls dirA/* dirB/* | awk -F '[/.]' '{if(++a[$2$3] > 1){v1="rm -f";v2=$1"/"$2"."$3;system(v1" "v2)}}'
  4. 4. ls dirA/* dirB/* | awk -F '[/.]' '{b[$3""$2]=$1;++a[$2];}END{v1="rm -f";for(i in a)if(a[i] > 1){t=b["che"i]"/"i".che";system(v1" "t)}}'
复制代码

论坛徽章:
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
13 [报告]
发表于 2013-06-18 14:51 |只看该作者
代号:军刀 发表于 2013-06-18 14:47
第一题第二题


欢迎多多参与,嘿嘿

论坛徽章:
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
14 [报告]
发表于 2013-06-18 14:52 |只看该作者
skylway 发表于 2013-06-18 13:57
可以用perl写吗?


也可以的,估计到时候要请perl的评委了。。。。

重在参与,呵呵

论坛徽章:
5
技术图书徽章
日期:2014-04-18 08:52:38午马
日期:2014-04-30 13:28:11摩羯座
日期:2014-11-07 13:34:122015年亚洲杯之日本
日期:2015-03-12 14:01:4915-16赛季CBA联赛之北京
日期:2017-06-28 17:25:56
15 [报告]
发表于 2013-06-18 15:33 |只看该作者
  1. 1)  awk '{print $NF}' illegal.log | sort | uniq -c | sort -rnk1 | head -10
复制代码

论坛徽章:
0
16 [报告]
发表于 2013-06-18 15:46 |只看该作者
1:cat illegal.log | awk '{++ip[$NF]} END {for (key in ip) print ip[key],key}' | sort -nr | head -n 10

论坛徽章:
22
CU大牛徽章
日期:2013-09-18 15:22:06白羊座
日期:2014-04-14 22:56:32午马
日期:2014-05-16 17:18:08巳蛇
日期:2014-05-30 20:53:19寅虎
日期:2014-06-03 10:53:34未羊
日期:2014-08-12 22:15:31神斗士
日期:2015-11-20 17:26:2515-16赛季CBA联赛之浙江
日期:2016-03-15 18:27:4215-16赛季CBA联赛之同曦
日期:2016-03-22 09:21:0115-16赛季CBA联赛之北控
日期:2017-03-26 21:47:12技术图书徽章
日期:2014-04-03 16:47:26摩羯座
日期:2014-03-25 23:51:36
17 [报告]
发表于 2013-06-18 16:17 |只看该作者
第四题:
command1 && command2 || command3

if command1
then
  command2
else
  command3
表达式肯定不一样:
主要是有一步:如果command1为真,command2为假的情况
第一条表达式最后会执行command3;但是第二条表达式则不会执行command3。

论坛徽章:
22
CU大牛徽章
日期:2013-09-18 15:22:06白羊座
日期:2014-04-14 22:56:32午马
日期:2014-05-16 17:18:08巳蛇
日期:2014-05-30 20:53:19寅虎
日期:2014-06-03 10:53:34未羊
日期:2014-08-12 22:15:31神斗士
日期:2015-11-20 17:26:2515-16赛季CBA联赛之浙江
日期:2016-03-15 18:27:4215-16赛季CBA联赛之同曦
日期:2016-03-22 09:21:0115-16赛季CBA联赛之北控
日期:2017-03-26 21:47:12技术图书徽章
日期:2014-04-03 16:47:26摩羯座
日期:2014-03-25 23:51:36
18 [报告]
发表于 2013-06-18 16:20 |只看该作者
第八题
如果当前目录下存在文件名包含空格(space)的文件,rm *可以删除它吗?为什么?
可以,使用rm时,*匹配除"."开头以外的所有文件,但不能匹配目录。

论坛徽章:
0
19 [报告]
发表于 2013-06-18 16:40 |只看该作者
1.
awk '{print $NF}' illegal.log |sort|uniq -c|sort -rn|head -10
2.

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
20 [报告]
发表于 2013-06-18 17:08 |只看该作者
本帖最后由 yestreenstars 于 2013-06-25 14:03 编辑

昨天居然没看到这个帖子~来晚了,先把会的做了吧,其他慢慢补充~
第一题:
  1. awk '{a[$NF]++}END{for(i in a)print i,a[i]}' illegal.log | sort -k2nr | head -10
复制代码
第四题:
区别莫非是前者比后者简洁?
第五题:
  1. echo '1234' | awk -F '' '{for(i=1;i<=NF;i++)s+=$i;print s}'
复制代码
第六题:
既然不能用-d参数,那我用-s和--date参数总行吧? 不过估计这个答案通不过,看评委的心情吧~
  1. date -s 2013-05-23
  2. date +%j
  3. date --date yesterday
复制代码
等我想出shell的方法再补充~
shell基础太差了,遇到数组的问题就放弃了,最后还是用我最熟悉的awk来做,代码和运行结果如下:
  1. [root@localhost ~]# cat a
  2. #!/bin/awk -f
  3. BEGIN{
  4.         FS="-"
  5. }
  6. {
  7.         $2+=0;
  8.         $3+=0;
  9.         a[1]=a[3]=a[5]=a[7]=a[8]=a[10]=a[12]=31;
  10.         a[4]=a[6]=a[9]=a[11]=30;
  11.         if($1%4==0&&$1%100!=0||$1%400==0)a[2]=29;
  12.         else a[2]=28;
  13.         if($2==1)print $3;
  14.         else{
  15.                 for(i=1;i<$2;i++)s+=a[i];
  16.                 print s+=$3
  17.         }
  18.         if($2==1&&$3==1)print $1-1"-12-31";
  19.         else if($3==1)printf "%d-%02d-%02d\n",$1,$2-1,a[$2-1];
  20.         else printf "%d-%02d-%02d\n", $1,$2,$3-1
  21. }
  22. [root@localhost ~]# ./a <<< "2013-05-23"
  23. 143
  24. 2013-05-22
  25. [root@localhost ~]#
复制代码
第七题:
半蒙半推(大部分是蒙的):
首先,根据所有的三位数都必须是奇数可以推出每行每列的最后一个数都是奇数,也就是1、3、5、7、9,其中有一个奇数被用了2次,就是在右下角的那个奇数。再根据总和为4446,可以推出位于右下角的奇数为1,因为1+3+5+7+9=25,此时只有1能使尾数变成6,所以一定是1。然后其他的,因为4446算是一个比较大的数了,所以我判断每行每列应该都是比较大的数字,所以我把较大的数字放在了行头或列头,尝试了3次,最终破解了,最终的九宫图如下:
  1. 8 4 7
  2. 6 2 5
  3. 9 3 1
复制代码
最后说明一下,管理员出这题的目的应该是要用算法来做的,但我算法太烂了,而这题的算法应该很复杂,所以我就投机取巧用这种半蒙半推的方法来做了~
第八题:
事实证明是可以的:
  1. [root@localhost test]# echo $SHELL
  2. /bin/bash
  3. [root@localhost test]# ll
  4. 总用量 0
  5. [root@localhost test]# touch "t t"
  6. [root@localhost test]# ll
  7. 总用量 0
  8. -rw-r--r--. 1 root root 0  5月 23 00:17 t t
  9. [root@localhost test]# rm *
  10. rm:是否删除普通空文件 "t t"?y
  11. [root@localhost test]# ll
  12. 总用量 0
  13. [root@localhost test]#
复制代码
我的理解是*代表所有文件,所以无论是否包含空格,都能删除~
第十题:
1.
  1. ls | grep -v '^20130605'
  2. ls | awk '!/^20130605/'
  3. ls | sed '/^20130605/d'
复制代码
2.
  1. ls | awk '{s=$0;gsub(/\[/,"");gsub(/\]/,"");gsub(/ /,"");system("mv \""s"\" "$0)}'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP