免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
1 [报告]
发表于 2012-03-24 15:23 |显示全部楼层
本帖最后由 Dreamhat 于 2012-03-24 15:46 编辑

环境:
Red Hat Enterprise Linux WS release 4 (Nahant Update 8 )
2.6.9-89.ELsmp #1 SMP Mon Apr 20 10:34:33 EDT 2009 i686 i686 i386 GNU/Linux

第一题:
有区别
  1. awk -F ' '
  2. 设定FS变量(输入域分隔符)为空格(一个或多个),或者tab(1个或多个),或者换行。而且会去除行首行末多余的空格
复制代码
  1. awk -F '[ ]'
  2. 设定FS变量(输入域分隔符)为一个空格
复制代码
  1. awk -F '[ ]+'
  2. 设定FS变量(输入域分隔符)为一个或者多个空格
复制代码
举个例子:

  1. [tlu@tlu-linux chinaunix]$ cat -A file
  2. aaa  bbb ccc^Iddd eee$
  3. 上面这个file文件里aaa之前是有个空格的,code里显示不出。
  4. [tlu@tlu-linux chinaunix]$ awk -F ' ' '{print $4}' file
  5. ddd
  6. [tlu@tlu-linux chinaunix]$ awk -F '[ ]' '{print $4}' file
  7. bbb
  8. [tlu@tlu-linux chinaunix]$ awk -F '[ ]+' '{print $4}' file
  9. ccc     ddd
复制代码

第二题:

  1. awk '/foo1/,/foo2/'
  2. sed -n '/foo1/,/foo2/p'
复制代码
这两个命令功能基本一样,但是有差异:
当foo1和foo2在同一行时,两者执行结果不同。
sed是行操作,找到有包含foo1的行时(同一行有无foo2不影响),打印开关(p)打开,然后再往下一行行的找foo2,如果找到了,打印开关就关闭。再往下如果找到foo1,打印开关再打开,如此反复直到文件末尾。
awk是先找foo1,然后找foo2(可以在同一行里),然后把找到的所有行打印出来,如此反复直到文件末尾。

例子:

  1. [tlu@tlu-linux chinaunix]$ cat file
  2. foo1foo2
  3. foo2
  4. foo1
  5. end
  6. [tlu@tlu-linux chinaunix]$ awk '/foo1/,/foo2/' file
  7. foo1foo2
  8. foo1
  9. end
  10. [tlu@tlu-linux chinaunix]$ sed -n '/foo1/,/foo2/p' file
  11. foo1foo2
  12. foo2
  13. foo1
  14. end
复制代码

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

  1. echo {a,b,c,e,f}{1,2,3}
复制代码

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

这道不太会

  1. echo 'aaabcccaaabbbccc' | sed 's#\(a\{1,\}\)\(b\{1,\}\)\(c\{1,\}\)\(a\{1,\}\)\(b\{1,\}\)\(c\{1,\}\)#\1\2\3\5#'
复制代码

第五题: 既然双引号中的\<newline>是续行符,为什么结果不是"foo  barabc def"?
echo "$(<urfile)"
这个命令是执行一个subshell运行<urfile,然后echo出来
需要用eval echo "$(<urfile)"再进行一次命令行处理,才能达到打印出"foo  barabc def"的效果

第六题:foo也bar之间为什么只有一个空格?
$()命令替换执行后,bash会根据$IFS中的字符做分割符进行从新分隔单词,所以多个空格,对echo看起来都一样的,是一个分隔符。

第七题:

  1. sed -n '/a/,'$(grep -n c file|tail -1|awk -F: '{print $1}')p'' file
复制代码

第八题:

  1. for (( i=1; i<9; i++))
  2. do
  3.         [[ $i -ne 8 ]] && let "j = $i + 2"
  4.         echo $(seq $i $j)
  5. done
复制代码

第九题:

  1. #!/bin/bash
  2. RESULT=./change_oracle_password_`date +%Y%m%d`
  3. > ${RESULT}
  4. echo -e "HOST\tRESULT\tNEW_PASSWORD" >> ${RESULT}

  5. for i in {1..1000}
  6. do
  7.         host=client$(printf "%04d\n" $i)
  8.         password=$(tr -dc 'A-Za-z0-9' < /dev/urandom | fold -w 8 |grep .*[0-9].*  -|grep .*[A-Z].* -|grep .*[a-z].* -|head -n 1)
  9.         ssh $host "echo "$password" | /usr/bin/passwd --stdin oracle"
  10.         if [ $? -eq 0];then
  11.                 echo -e "$host\tsuccess\t$password" >> ${RESULT}
  12.         else
  13.                 echo -e "$host\tfailed" >> ${RESULT}
  14.         fi        
  15. done
复制代码

第十题:

  1. #!/bin/bash
  2. #以下oracel相关部分google搜来,未测试
  3. export ORACLE_HOME=/path/to/oracle/
  4. export ORACLE_SID=...
  5. export PATH=$ORACLE_HOME/bin:$PATH

  6. sqlplus -silent <<SQLScript
  7. myuser/mypass
  8. set pages 0
  9. set feedback off
  10. set echo off
  11. spool ./dump_employee1_id
  12. select id from employee1
  13. spool off
  14. SQLScript

  15. sqlplus -silent <<SQLScript
  16. myuser/mypass
  17. set pages 0
  18. set feedback off
  19. set echo off
  20. spool ./dump_employee1_email
  21. select email from employee1
  22. spool off
  23. SQLScript

  24. mysql -u myuser -pmypass --batch -e 'select id from employee2' dbSecond | sed '1d' > dump_employee2_id
  25. mysql -u myuser -pmypass --batch -e 'select email from employee2' dbSecond | sed '1d' > dump_employee2_email

  26. for i in "dump_employee1_id" "dump_employee2_id" "dump_employee1_email" "dump_employee2_email"
  27. do
  28.         sort $i > ${i}_sort
  29. done

  30. comm -23 dump_employee1_id_sort dump_employee2_id_sort > different_id.txt
  31. comm -13 dump_employee1_id_sort dump_employee2_id_sort >> different_id.txt
  32. comm -23 dump_employee1_email_sort dump_employee2_email_sort > different_email.txt
  33. comm -13 dump_employee1_email_sort dump_employee2_email_sort >> different_email.txt
复制代码

最后谢谢各位评委。。。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP