免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 124885 | 回复: 112
打印 上一主题 下一主题

[游戏娱乐] 2012年ChinaUnix社区Shell编程大赛 [结束评审 公布部分答案](获奖名单已公布-5-24) [复制链接]

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-06 21:21 |只看该作者 |倒序浏览
获奖名单已公布,详情请看:http://bbs.chinaunix.net/thread-3747243-1-1.html

部分参考答案:

第七二楼:http://bbs.chinaunix.net/forum.p ... 401&fromuid=7944836

参与者得分排名:

ID:waker                    93
ID:iamhere2007          66
ID:seesea2517           63
ID:xinyv                     61
ID:Dreamhat              58
ID:ywlscpl                  53
ID:jiejie455                50
ID:hq8318                 49
ID:scuhy                    40
ID:jiayanfu                 39
ID:lkk2003rty             38
ID:xiaopan3322          35
ID:chnliyong               29
ID:zhaopingzi             16

——————————————————————————2012年4月9日——————————————————————————————————

大赛简介:

Shell版块是ChinaUnix社区内讨论比较热烈的技术版块之一。2011年,我们已经成功举办了Shell、PHP、C/C++和Perl的编程大赛,今天我们应版面用户的需求,再次举办2012年ChinaUnix社区Shell编程大赛,发挥您的技术之长,赢取我们为优胜者准备的丰富奖品,欢迎大家踊跃参加!

第一期:PHP编程大赛 http://bbs.chinaunix.net/thread-1788191-1-1.html
第二期:C/C++编程大赛http://bbs.chinaunix.net/thread-1820953-1-1.html
第三期:Perl编程大赛http://bbs.chinaunix.net/thread-1860259-1-1.html
第四期:shell编程大赛http://bbs.chinaunix.net/thread-2319120-1-1.html

参赛要求:参与活动必须是chinaunix社区的注册会员

点击注册: http://sso.chinaunix.net/Register

大赛日程:

参赛时间:2012.03.6~2012.03.25

评选时间:2012.03.26~2012.04.6

结果公布:2012.04.10

奖项设置:


一等奖:3名,最先正确完成10道题的三名用户,赠送微软IE3.0复刻版鼠标一个。
二等奖:5名,获奖者为最先正确完成8道试题的五名用户,赠送特别定制版ChinaUnix定制版坎肩一件。
三等奖:10名,获奖者为最先正确完成6道试题的十名用户,赠送图书一本,图书目录见附录。
图书目录.txt (2.14 KB, 下载次数: 408)

参赛细则:
(1)代码规范:使用各种标准shell,awk,sed,采用编程标准可以使项目更加顺利地完成。
(2)性能:应用程序可以运行与高效运行是两个层次,保证程序的最佳效率。
(3)简洁:写代码是一种艺术。除了正确的缩进、大小写、命名规则之外,请时刻牢记爱因斯坦的名言--简单就是美。
(4)每位会员可以发表多个代码,以最高评价为准,不可重复获奖;
(5)提交代码请跟帖发表,并附相关系统环境及编译环境说明。
评选获奖的依据:答题的时间及答题的质量为依据,邀请嘉宾作为评选人。

代码提交:
本次大赛为闭卷形式,主题发起者才能看到参赛者的回复,所有参赛者只能看到自己的内容。
参赛者以跟帖的方式提交代码,相似代码以最先提交为准,谁最早提交谁优秀。
注:严禁抄袭,一经发现,取消评选资格;


大赛评委团:

blackold
Shell_HAT
yinyuemi
zooyo

大赛联系人:

send_linux 站内联系或者qq:19286680

大赛试题:


第一题:
  1. awk -F ' '
  2. awk -F '[ ]'
  3. awk -F '[ ]+'
  4. 三者有区别么?
复制代码
第二题:

  1. awk '/foo1/,/foo2/'
  2. sed -n '/foo1/,/foo2/p'
  3. 实现的功能一样么?
复制代码
第三题:

  1. 如何用最简单的方法列举出 "a b c e f" 和"1 2 3" 的所有组合?
复制代码
第四题:

  1. 字符串 'aaabcccaaabbbccc',连续的字母作为一个子字符串,从左往右,去重复后,变为 'aaabcccbbb' , awk或sed实现,不使用管道。
复制代码
第五、六题:

  1. $ cat urfile
  2. foo  bar\
  3. abc def

  4. $ xxd urfile
  5. 0000000: 666f 6f20 2062 6172 5c0a 6162 6320 6465  foo  bar\.abc de
  6. 0000010: 660a                                     f.

  7. $ echo "$(<urfile)"
  8. foo  bar\
  9. abc def

  10. 第五题: 既然双引号中的\<newline>是续行符,为什么结果不是"foo  barabc def"?

  11. $ echo $(<urfile)
  12. foo bar\ abc def

  13. 第六题:foo也bar之间为什么只有一个空格?
复制代码
第七题:

  1. $ cat file
  2. 1
  3. 2
  4. a
  5. b
  6. c
  7. d
  8. c
  9. e
  10. 如何取到 a ~ c 之间的所有行:
  11. a
  12. b
  13. c
  14. d
  15. c
复制代码
第八题:

  1. $ seq 9
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10. 9
  11. 如果得到以下结果:
  12. 1 2 3
  13. 2 3 4
  14. 3 4 5
  15. 4 5 6
  16. 5 6 7
  17. 6 7 8
  18. 7 8 9
  19. 8 9
复制代码
第九题:

  1. 有一千台机器client0001、client0002、......、client1000需要定期修改oracle这个用户的密码,另外一台机器server0000分别与它们建立了ssh信任关系。请在server0000上用shell脚本生成一个随机字符串,然后批量连接这一千台机器并修改oracle用户的密码,这些client机器统一使用前面生成的字符串作为新密码。密码的复杂度要求是:8位长度,至少1位小写字母,至少1位大写字母,至少1为数字。最后生成一份统计信息,记录哪些机器修改成功,哪些机器修改失败,并记录新的密码。
复制代码
第十题:

  1. Oracle数据库dbFirst里面有一张表employee1,包含两列:id和email。MySQL数据库dbSecond里面有一张表employee2,同样包含两列:id和email。两个数据库的用户名都是myuser,密码都是mypass,两张表的数据量都在一千万行左右。请用shell脚本获取两张表的数据,然后比较出两张表中互不相同的id和email分别输出到文件different_id.txt和different_email.txt。
复制代码
微软IE3.0复刻版鼠标:


ChinaUnix定制版坎肩:

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
2 [报告]
发表于 2012-03-06 21:27 |只看该作者

论坛徽章:
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
3 [报告]
发表于 2012-03-06 21:30 |只看该作者
本帖最后由 zhaopingzi 于 2012-03-08 00:13 编辑

  1. 定制版坎肩很好看,我想买一件;以我的水平通过比赛获得是没戏了
复制代码
1.

  1.   没看出有啥区别来
  2.   
复制代码
2:

  1. 实现功能一样
复制代码
4:这个算对吗,能得到答案,哈哈:

  1. $ echo aaabcccaaabbbccc|sed 's/aaa//2;s/ccc//2'
  2. aaabcccbbb
复制代码
7:写得比较龌蹉,但是能得到正确答案

  1. $cat shell.sh
  2. #!/bin/bash
  3. tail=`grep -n "c" file|tail -1|awk -F: '{print $1}'`
  4. head=`grep -n "a" file|head -1|awk -F: '{print $1}'`
  5. sed -n "${head},${tail}p" file

  6. $sh shell.sh
  7. a
  8. b
  9. c
  10. d
  11. c
复制代码
8:

  1. #cat shell.sh
  2. #!/bin/bash
  3. var=`seq 9|paste -s -d ""`
  4. for i in `seq 8`
  5.    do
  6.      echo $var|cut -c$i-$((i+2))
  7.    done
  8. #sh shell.sh
  9. 123
  10. 234
  11. 345
  12. 456
  13. 567
  14. 678
  15. 789
  16. 89
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-03-06 21:34 |只看该作者
本帖最后由 xiaopan3322 于 2012-03-08 13:54 编辑

第1题:
有区别:

  1. 1): 以空白字符为FS,即包括:空格,制表符等,换言之,只要遇到空白字符,不管多少,都将作为FS
  2. 2): 以[ ]限定了空白字符的形态和个数,形态为空格(不包括其他空白符,如制表符),个数为1
  3. 3): 以多个空格作为FS
复制代码
第2题:
一样

第3题:
这题差点看错,原来有陷阱
  1. echo {a..c}{1..3} {e..f}{1..3}
复制代码
  1. echo {a,b,c,e,f}{1..3}
复制代码

第4题:

第五、六题:
这里涉及到Shell解释器的解释过程。
这里涉及的是Word SplittingShell Expansion
放到这里,就是Weak Quotes(双引号)和command substitution(命令置换)的作用:
未加双引号:

  1. 首先,shell会对扩展结果(命令置换是Shell扩展的一种),按照$IFS(包括<space><tab><newline>)进行单词分割,这里<newline>和多个<space>输出成了单个空格就是Word Splitting的结果。
  2. 其次,命令置换会将命令的输出按照"字面意思(即不会被转义)"转换:因此反斜线依旧是反斜线。
复制代码
加了双引号:
  1. 不会发生Word Splitting,作用就成了:输出urfile本身到标准输出!
复制代码

第七题:
  1. sed -n '/a/,/c/{/c/!p};/c/,/c/p' file
复制代码

论坛徽章:
3
CU大牛徽章
日期:2013-05-20 10:43:41CU大牛徽章
日期:2013-05-20 10:44:06CU大牛徽章
日期:2013-05-20 10:44:16
5 [报告]
发表于 2012-03-06 21:41 |只看该作者
有机会也参加一下,嘿嘿

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
6 [报告]
发表于 2012-03-06 22:23 |只看该作者
图书目录肿么木有啦?

论坛徽章:
0
7 [报告]
发表于 2012-03-07 00:01 |只看该作者
本帖最后由 lkk2003rty 于 2012-03-21 16:54 编辑

1

  1. awk -F ' '   一个字符作为一个域
  2. 例如 super@freemind:~$ echo "12345" | awk -F '' '{print $1,NF}'
  3. 1 5

  4. awk -F '[ ]'  一个空格作为分隔符
  5. 例如 super@freemind:~$ echo "1 2  345" | awk -F '[ ]' '{print $3,NF}'
  6. 4
  7. 第三个域是空字符串即‘’
  8. awk -F '[ ]+'  一个或多个空格作为分隔符
  9. 例如 super@freemind:~$ echo "1 2  345" | awk -F '[ ]+' '{print $3,NF}'
  10. 345 3

  11.   
复制代码
2

  1. 二者一样.
  2. 输出最先匹配到foo1的行到离这行最近的匹配到foo2的行的内容,如果这行之后的所有行都不匹配foo2则输出这行之后的所有行(以上输出都包含匹配的行)。如果没有任何一行匹配到foo1则没有任何输出。如果有类似如下形式的多组,则将多组输出
  3. 匹配foo1的行
  4. 。。。。       多行既不匹配foo1也不匹配foo2
  5. 匹配foo2的行
  6. 例如

  7. super@freemind:~$ echo -e "foo1\nfoo2\nfoo2foo131232\nfoo2\nfoo2" | sed -n  '/foo1/,/foo2/p'
  8. foo1
  9. foo2
  10. foo2foo131232
  11. foo2
复制代码
3

  1. : | gawk 'END{split("abcef123",a,"");for(i=1;i<256;i++){t="";for(j=0;j<8;j++)if(and(1,rshift(i,j))==1)t=t""a[j+1];print t }}'
复制代码
4

  1. BEGIN{FS=""}
  2. {
  3.     pat[1]=$1;
  4.     for(i=2;i<=NF;i++)
  5.     {
  6.         if($i!=$1)
  7.         {
  8.             t=$i;
  9.             k=$i;
  10.             break;
  11.         }
  12.         pat[1]=pat[1]""$i;
  13.     }
  14.     s[pat[1]]=1;
  15.     j=2;
  16.     k="";
  17.     for(;i<=NF;i++)
  18.     {
  19.         if($i!=t)
  20.         {
  21.             if(!(k in s))
  22.             {
  23.                 pat[j++]=k;
  24.                 s[k]=1;
  25.             }
  26.             t=$i;
  27.             k="";
  28.         }
  29.         k=k""$i;
  30.     }   
  31. }
  32. END{
  33.     t="";
  34.     for(i=1;i<=length(pat);i++)
  35.         t=t""pat[i];
  36.     print t;
  37. }

  38. 使用方法 echo  'aaabcccaaabbbccc' | awk -f 4.awk
复制代码
7

  1. super@freemind:~$ echo '1
  2. > 2
  3. > 3
  4. > a
  5. > b
  6. > c
  7. > d
  8. > c
  9. > e' | awk '/^a/{b=1}b{a=a"\n"$0;}END{sub(/[^c]*$/,"",a);print a}'

  10. a
  11. b
  12. c
  13. d
  14. c
复制代码
8
  1. super@freemind:~$ seq 9  | sed -n -e '1{N;N;ba;};x;G;ba;:a s/\n/ /g;p;s/[0-9] //;x;${x;p;}'
  2. 1 2 3
  3. 2 3 4
  4. 3 4 5
  5. 4 5 6
  6. 5 6 7
  7. 6 7 8
  8. 7 8 9
  9. 8 9


复制代码
9

  1. #!/bin/bash
  2. pass=$(mkpasswd -l 8 -d 1 -c 1 -C 1)
  3. echo "${pass}"
  4. log_file=pwd_$(date +%Y-%m-%d).log
  5. while read ip
  6.     do
  7.     ssh root@${ip} passwd --stdin oracle<<< "${pass}"
  8.     if [ $? -eq 0 ]
  9.         then
  10.         echo -e "$(date "+%Y-%m-%d %H:%M:%S")\t${ip}\t${pass}\tok" >> ${log_file}
  11.     else
  12.         echo -e "$(date "+%Y-%m-%d %H:%M:%S")\t${ip}\t${pass}\tfail" >> ${log_file}
  13.     fi
  14. done<ip_file

复制代码
ip_file格式为每行为要改密码机子的ip

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
8 [报告]
发表于 2012-03-07 02:26 |只看该作者
本帖最后由 yinyuemi 于 2012-03-07 06:11 编辑

鼠标相当不错啊

论坛徽章:
0
9 [报告]
发表于 2012-03-07 09:00 |只看该作者
本帖最后由 crulat 于 2012-03-11 18:12 编辑

支持这个活动!

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
10 [报告]
发表于 2012-03-07 11:35 |只看该作者
今天没空……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP