Chinaunix

标题: 2013年ChinaUnix社区Shell编程大赛!(获奖名单公布)! [打印本页]

作者: send_linux    时间: 2013-06-17 11:29
标题: 2013年ChinaUnix社区Shell编程大赛!(获奖名单公布)!
获奖名单公布:http://bbs.chinaunix.net/thread-4092314-1-1.html

大赛简介:
Shell版块是ChinaUnix社区内讨论比较热烈的技术版块之一。2011年和2012年,我们已经成功举办了Shell、PHP、C/C++和Perl的多次编程大赛,今天我们应shell版版主和用户的需求,再次举办2013年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
第五期:shell编程大赛http://bbs.chinaunix.net/thread-3679733-1-1.html

参赛要求:参与活动必须是chinaunix社区的注册会员
点击注册: http://sso.chinaunix.net/Register

大赛日程:
参赛时间:2013.06.18~2013.07.8
评选时间:2013.07.8~2013.07.18
结果公布:2013.07.23

奖项设置:

一等奖:1名,最先正确完成10道题的一名用户,赠送价值400元的500G移动硬盘一个。
二等奖:3名,获奖者为最先正确完成8道试题的三名用户,赠送价值200元防水耳机一副。
三等奖:10名,获奖者为最先正确完成6道试题的十名用户,赠送图书一本,图书目录(http://bbs.chinaunix.net/thread-4074217-1-1.html)。
参与奖:5名,只要您参与提交答案,且有一道题目正确,即可参与抽奖,可获赠赠送微软键鼠套装一个


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

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


大赛评委团:
Shell_HAT
rdcwayx
zooyo
blackold

大赛联系人:

send_linux 站内联系或者qq:19286680

大赛试题:


第一题:
有一小撮别有用心的人,他们会想办法获取论坛的用户名列表,然后用弱密码逐个尝试每一个用户名。针对这一情况,论坛程序会把每一次登陆失败的记录放在日志里面。请编写脚本找出尝试登陆失败次数最多的 top 10 的IP地址和登陆失败次数。测试数据见附件illegal.log

illegal.log (59.18 KB, 下载次数: 395)

第二题:
请编写脚本监控日志文件中的关键字<Error>,一旦发现该关键字就马上发邮件给admin@ChinaUnix.net,样例数据见附件wls_ms1.out,要求如下:
(1)假设该脚本在crontab中每10分钟执行一次,每次运行时只检测最近十分钟之内的日志里面有没有出现关键字,十分钟之前的日志不要误报。
(2)样例数据仅供参考,实际日志文件比较大(比如1GB),请充分考虑代码效率。
(3)应用程序会实时地更新这个日志文件,因此不允许对该文件进行分割。

wls_ms1.out (4.16 KB, 下载次数: 194)
第三题:
请在本地机器192.168.1.2上编写脚本,把远程192.168.1.3 ~ 192.168.1.100每台机器上的某个文件夹打包压缩复制到本地作为备份。本地机器和远程机器之间已经建立好ssh信任关系。要求如下:
(1)远程机器上待备份的文件路径为 /opt/WebSphere/AppServer/profiles/
(2)以下子文件夹不需要备份:
        bin
        logs
(3)以下文件不需要备份:
        *.log
        *heapdump*
        *.gz
        *.tar
        *.zip
        *.bak
(4)本地机器上存放备份文件的目录为 /var/ChinaUnix/
(5)星期一到星期六执行增量备份,星期日执行完整备份。crontab里面只允许增加一条记录用于执行脚本。
(6)考虑到脚本在各种UNIX/Linux系统中的通用性,不允许使用rsync命令。

第四题:
下面的两种表达有何不同:

command1 && command2 || command3

if command1
then
  command2
else
  command3
fi

第五题:
给出一个多位数,算出其每位数的总和。比如 1234, 得到 10

第六题:
如果不考虑 GNU date (就是不带 -d 参数),
1. 如果给个日期 比如 2013-05-23,算出是这年的第几天。
2. 算出昨天日期

第七题:
把1~9 九個數字分成三組三位數(不可重复使用),比如形成如下的9宫格。

4 9 1
8 3 6
2 7 5

求三行和三列数的总和,如上面的例子,得到一个总和: 491 + 836 + 275 + 482 + 937 + 165 =  3186

题目要求,所有的三位数都必须是奇数,总和是 4446.  求出这个九宫格排列。

(需要给出解题的shell代码,以及该代码运行的结果,结果不唯一)
第八题:
[bash]如果当前目录下存在文件名包含空格(space)的文件,rm *可以删除它吗?为什么?

第九题:
bash 的参数展开( parameter expansion) 在路径展开( pathname expansion) 之前。举
个例子来验证这一说法。

第十题:
目录dirA 和 dirB 下的文件类似于:

20130605 1527 厂长[979909063] - 龙行天下[162256958].che
20130605 1541 我行我素[439395038]- 随便[1559914175].che
20130606 0912 厂长[979909063] - 龙行天下[162256958].che
20130606 1757 黑哥[1578318706] - 随便[1559914175].che
20130606 1823 黑哥[1578318706] - 随便[1559914175].che
20130606 0912 厂长[979909063] - 龙行天下[162256958].XQF

其中, .che为QQ游戏自动保存的中国象棋格式,.XQF为另一种中国象棋格式,由.che转换而来。
两个目录可能存在重复的文件(文件名相同且内容相同)。
要求:

1. 用最简洁的命令列出当前目录下的非 20130605开头的文件。
2. 将文件名中所有的空格, []去掉。
3. 删除 dirA 下与 dirB 下重复的.che或.XQF文件。
4. 如果有对应的 .XQF文件,则删除相应的.che文件。
这种对应关系可能跨目录,比如dirA/file.che 与 dirB/file.XQF也看作是对应文件。

(关于第10题的补充说明:
各小题基本上是相对独立的。
为简单起见,1小题单独写,其余小题合在一起写,后一小题在前一小题的基础上完成。
"重复文件"是指: 文件相同,且内容相同。
"对应文件"是指: .che与 .XQF之间的关系,比如,dirA/file.che dirB/file.XQF 看作对应文件。
.XQF文件是由 .che转换而来,把它们称为对应文件。)


作者: idi0t    时间: 2013-06-18 10:12
还没那水平,坐个沙发看表演
作者: 7looki    时间: 2013-06-18 10:13
怎么没看到试题?
作者: heidern    时间: 2013-06-18 10:45
题呢??题呢??题呢??
作者: ELAPSE13LINUX    时间: 2013-06-18 11:11
想参加 怎么没有具体的呢 比如 如何报名 比赛时间? 什么的?
作者: lihp123    时间: 2013-06-18 11:16
占位  占位
作者: godymoon    时间: 2013-06-18 12:11
题目在哪里?
作者: wenhq    时间: 2013-06-18 13:07
好久没来了。。。。
作者: skylway    时间: 2013-06-18 13:57
可以用perl写吗?
作者: expert1    时间: 2013-06-18 14:19
好题目啊。
作者: send_linux    时间: 2013-06-18 14:23
expert1 发表于 2013-06-18 14:19
好题目啊。


欢迎多多参与!
作者: 代号:军刀    时间: 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)}}'
复制代码

作者: send_linux    时间: 2013-06-18 14:51
代号:军刀 发表于 2013-06-18 14:47
第一题第二题


欢迎多多参与,嘿嘿
作者: send_linux    时间: 2013-06-18 14:52
skylway 发表于 2013-06-18 13:57
可以用perl写吗?


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

重在参与,呵呵
作者: murdercool    时间: 2013-06-18 15:33
  1. 1)  awk '{print $NF}' illegal.log | sort | uniq -c | sort -rnk1 | head -10
复制代码

作者: 4578004    时间: 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
作者: GB_juno    时间: 2013-06-18 16:17
第四题:
command1 && command2 || command3

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

作者: GB_juno    时间: 2013-06-18 16:20
第八题
如果当前目录下存在文件名包含空格(space)的文件,rm *可以删除它吗?为什么?
可以,使用rm时,*匹配除"."开头以外的所有文件,但不能匹配目录。
作者: heidern    时间: 2013-06-18 16:40
1.
awk '{print $NF}' illegal.log |sort|uniq -c|sort -rn|head -10
2.
作者: yestreenstars    时间: 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)}'
复制代码

作者: rucypli    时间: 2013-06-18 18:01
本帖最后由 rucypli 于 2013-06-18 18:02 编辑

1 awk '{a[$6]=a[$6]+1}END{for(i in a)print i,a}' illegal.log | sort -g -k 2 -r | head -10
作者: WilliBhamlll    时间: 2013-06-18 18:02
本帖最后由 WilliBhamlll 于 2013-07-03 15:02 编辑

系统环境和软件版本如下:
  1. $cat /proc/version
  2. Linux version 2.6.18-164.el5xen (mockbuild@x86-002.build.bos.redhat.com) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)) #1 SMP Tue Aug 18 16:06:30 EDT 2009

  3. $bash --version
  4. GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu)
  5. Copyright (C) 2005 Free Software Foundation, Inc.

  6. $awk --version|more -2
  7. GNU Awk 3.1.5
  8. Copyright (C) 1989, 1991-2005 Free Software Foundation.

  9. $sed --version|more -2   
  10. GNU sed version 4.1.5
  11. Copyright (C) 2003 Free Software Foundation, Inc.
复制代码
第一题:
  1. $ awk '$6{a[$6]++}END{for(i in a)print a[i],i|"sort -n|tail -10"}' illegal.log  
  2. 16 91.237.249.67
  3. 19 74.91.23.27
  4. 22 222.186.26.26
  5. 23 111.73.45.13
  6. 27 142.4.117.83
  7. 28 220.250.58.172
  8. 29 220.250.52.90
  9. 30 220.250.58.171
  10. 36 220.250.58.170
  11. 70 220.250.52.66
复制代码
第二题:
  1. awk -F '[ :]+' -vd=$(date +%I%M -d "-10 minutes") -vd2=$(LANG=C;date +%b) '/<Error>/&&$4$5>=d&&$1=="<"d2{system("mail -s "Log Error" admin@ChinaUnix.net")}' wls_ms1.out
复制代码
第三题:
  1. #!/bin/bash
  2. dir=/opt/WebSphere/AppServer/profiles
  3. localip=192.168.1.2
  4. localdir=/var/ChinaUnix
  5. for((i=3;i<=100;i++))
  6. do
  7.         if [ `date +%w` = 0 ];then
  8.                 ssh 192.168.1.$i "cd $dir;tar -g will -zcvf backup_full_192.168.1.$i_$(date +%F).tar.gz --exclude=./bin --exclude=./logs --exclude=./*.log --exclude=./*heapdump* --exclude=./*.gz --exclude=./*.tar --exclude=./zip --exclude=./bak .;scp backup_full_192.168.1.$i_$(date +%F).tar.gz root@$localip:$localdir"
  9.         else
  10.                 ssh 192.168.1.$i "cd $dir;tar -g will -zcvf incremental_192.168.1.$i_$(date +%F).tar.gz --exclude=./bin --exclude=./logs --exclude=./*.log --exclude=./*heapdump* --exclude=./*.gz --exclude=./*.tar --exclude=./zip --exclude=./bak .;scp incremental_192.168.1.$i_$(date +%F).tar.gz root@$localip:$localdir"

  11.         fi
  12. done
复制代码
第四题:
不同之处在于:
command1 && command2 || command3 可以有两个测试条件,if command1....无法实现。
如:
  1. $ A=123
  2. $ [ -n "$A" ] && [ "$A" -lt 100 ] || echo 'too big!'
复制代码
第五题:
  1. echo '1234
  2. > 1234567
  3. > 123456789'|awk -F '' '{s=0;for(i=1;i<=NF;i++){s+=$i};print s}'
  4. 10
  5. 28
  6. 45
复制代码
第六题:
1.
  1. $ ./dd1.sh
  2. Enter your date:
  3. 20130523
  4. 143

  5. $cat dd1.sh
  6. #!/bin/bash
  7. #参考Shell_HAT版主代码
  8. #此脚本仅限于计算2013的某一天是这年的第几天。
  9. date2days(){
  10.     echo "$*" | awk '{
  11.         z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3;
  12.         j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633;
  13.         print j
  14.     }'
  15. }

  16. echo "Enter your date:"
  17. read day1
  18. day2=20121231
  19. date1=$(date2days ${day1:0:4} ${day1:4:2} ${day1:6:2})
  20. date2=$(date2days ${day2:0:4} ${day2:4:2} ${day2:6:2})
  21. result=$(($date1-$date2))
  22. echo $result
复制代码
2.
  1. $date +%F
  2. 2013-06-19
  3. $./dd2.sh
  4. 2013-06-18
  5. $cat dd2.sh
  6. #!/bin/bash
  7. date2days(){
  8.     echo "$1 $2 $3" | awk '{
  9.         z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3;
  10.         j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633;
  11.         print j
  12.     }'
  13. }

  14. days2date(){
  15.     echo "$1" | awk '{
  16.         a=$1+2472632; b=int((4*a+3)/146097); c=int((-b*146097)/4)+a;
  17.         d=int((4*c+3)/1461); e=int((-1461*d)/4)+c; m=int((5*e+2)/153);
  18.         dd=-int((153*m+2)/5)+e+1; mm=int(-m/10)*12+m+3; yy=b*100+d-4800+int(m/10);
  19.         printf ("%4d-%02d-%02d\n",yy,mm,dd)
  20.     }'
  21. }

  22. year=`date +%Y`; month=`date +%m`; day=`date +%d`
  23. days=`date2days $year $month $day`
  24. date=$(($days-1))
  25. days2date $date
复制代码
第七题:
第八题:
可以删除。rm *中的*是通配符,可以匹配0或多个任意字符。
例如a*b  a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, a  b, a012b, ab。

第九题:
举例如下:
  1. $mkdir -p /tmp/1/2/{old,new,dist,bugs}
  2. $ls -R /tmp/1
  3. /tmp/1:
  4. 2

  5. /tmp/1/2:
  6. bugs  dist  new  old

  7. /tmp/1/2/bugs:

  8. /tmp/1/2/dist:

  9. /tmp/1/2/new:

  10. /tmp/1/2/old:
复制代码
第十题:
1.
  1. ls|grep -v '^20130605'
  2.   ls|awk '!/20130605/'
  3.   ls|sed '/20130605/!d'
复制代码
2.
  1. ls|sed 's/.*/mv "&" \`echo & \| sed "s\/ \/\/g"\`/ge'
复制代码
3.
  1. for i in `find dirA dirB -type f|awk -F'/' '{a[$NF]++}END{for(i in a)if(a[i]>=2)print i}'`;do rm -f dirA/$i;rm -f dirB/$i;done
复制代码
4.
  1. for i in `find dirA dirB -type f|awk -F'[/.]' '{a[$(NF-1)]++}END{for(i in a)if(a[i]>=2)print i}'`;do rm do rm -f dirA/$i.che;rm -f dirB/$i.che;done
复制代码

作者: winway1988    时间: 2013-06-18 19:55
  1. 1.
  2. awk '{a[$NF]++}END{for(i in a)print a[i],i | "sort -nr | head -n 10"}' illegal.log        
  3. 70 220.250.52.66
  4. 36 220.250.58.170
  5. 30 220.250.58.171
  6. 29 220.250.52.90
  7. 28 220.250.58.172
  8. 27 142.4.117.83
  9. 23 111.73.45.13
  10. 22 222.186.26.26
  11. 19 74.91.23.27
  12. 16 91.237.249.67

  13. 2.
  14. #! /bin/bash
  15. #

  16. subject="Error!"
  17. receiver=xxx@xxx.com

  18. isnew=0
  19. while read line
  20. do
  21.     if [[ $isnew -eq 1 ]]
  22.     then
  23.         if echo "$line" | grep -q -i 'error'
  24.         then
  25.             echo $line | mutt -s "$subject" $receiver
  26.             break
  27.         fi

  28.         continue
  29.     fi

  30.     time=$(echo $line | sed 's/<\([^P]*\).*/\1/')
  31.     if [[ $(( $(date '+%s') - $(date -d 'Jun 18, 2013 16:09:40' '+%s') )) -le 600 ]]
  32.     then
  33.         isnew=1
  34.     fi
  35. done <wls_ms1.out

  36. 3.


  37. 4.
  38. (1)command1 && command2 || command3
  39. 当command1执行成功,command2执行失败时,command3会执行
  40. date && ls 'nofile' || echo 'fuck'  
  41. Tue Jun 18 16:35:01 CST 2013
  42. ls: nofile: No such file or directory
  43. fuck
  44. (2)if command1
  45. then
  46.    command2
  47. else
  48.    command3
  49. fi
  50. 在任何情况下只会执行command2和command3中的一个

  51. 5.
  52. echo '1234' | awk -vFS='' '{for(i=1;i<=NF;i++)sum+=$i}END{print sum}'     
  53. 10

  54. 6.
  55. #! /bin/bash
  56. #

  57. nth_day() {
  58.     local dayofmonth=(31 28 31 30 31 30 31 31 30 31 30 31)
  59.     local date=$1
  60.     local year=${date%%-*}
  61.     local month=${date#*-}
  62.     month=${month%-*}
  63.     local day=${date##*-}

  64.     if [[ $((year % 400)) -eq 0 ]] ||\
  65.         [[ $((year % 4)) -eq 0 && $((year % 100)) -ne 0 ]]
  66.     then
  67.         dayofmonth[1]=$((${dayofmonth[1]} + 1))
  68.     fi

  69.     local days=0
  70.     for((m=0; m<month-1; m++))
  71.     do
  72.        ((days += dayofmonth[m]))
  73.     done
  74.     return $(($days + $day))
  75. }

  76. yesterday() {
  77.     local dayofmonth=(31 28 31 30 31 30 31 31 30 31 30 31)
  78.     local year=$(date '+%Y')
  79.     local month=$(date '+%m')
  80.     local day=$(date '+%d')

  81.     if [[ $day -gt 1 ]]
  82.     then
  83.         ((day -= 1))
  84.     elif [[ $month -gt 1 ]]
  85.     then
  86.         ((month -= 1))
  87.         day=${dayofmonth[$((month-1))]}
  88.     else
  89.         ((year--))
  90.         month=12
  91.         day=31
  92.     fi

  93.     echo $year-$month-$day
  94. }

  95. nth_day '2013-05-23'
  96. echo $?
  97. yesterday

  98. 7.


  99. 8.
  100. 能,*是通配符,代表任意字符串

  101. 9.
  102. [winway@winway 1]$ touch test
  103. [winway@winway 1]$ a=te      
  104. [winway@winway 1]$ ls $a*   
  105. test

  106. 10.
  107. (1)ls 2013060[!5]*
  108. (2)for file in *; do echo "$file" | sed 'H;s/[][ ,]//g;G;s/\(.*\)\n\(.*\)/mv "\2" \1/e'; done
  109. (3)cd dirA;for f in *; do if ls -1 dirB | grep -q "$f"; then rm -f "$f" "dirb/$f"; done
  110. (4)for f in dirA/*.XQF dirB/*.XQF; do rm -f {dirA,dirB}/${f%.XQF}.che; done
复制代码

作者: dc222222222    时间: 2013-06-18 20:29
第一题(思路:awk+关联数组)
  1. #!/bin/bash
  2. cat illegal.log |
  3. awk '
  4. { fail_user[$6]++; }
  5. END{
  6.         for (i in fail_user)
  7.         {
  8.                 printf("%-20s %s\n",i,fail_user[i]);
  9.         }
  10. }' | sort -nrk 2 | head -n 10
复制代码

作者: 密码很长    时间: 2013-06-18 21:46
第一题:
sed 's/.* \t//' illegal.log|sort|uniq -c|sort -rn|head -10
            

第五题:
echo "1234"|sed 's/./+&/g'|sed 's/^+//'|bc

作者: remark    时间: 2013-06-18 21:58
本帖最后由 remark 于 2013-06-20 12:15 编辑

第一题
awk '{m[$NF]++} END{for(k in m) print k,m[k]}' illegal.log|sort -k2n|tail -10
第四题
相同执行结果的应该是
if Command1 then
     if Command2 then
          ;
     else
          Command3
     fi
else
     Command3
fi
第五题
echo 1234|awk 'BEGIN{getline d; i=1; while(i<=length(d) { iSum+=substr(d,i,1); i++; } print iSum; }'
作者: yinyuemi    时间: 2013-06-18 22:25
好活动,支持!
作者: jihaiming    时间: 2013-06-18 23:20
-_-! 连学习的机会也没有了吗?
都隐藏了
作者: send_linux    时间: 2013-06-18 23:27
jihaiming 发表于 2013-06-18 23:20
-_-! 连学习的机会也没有了吗?
都隐藏了


等比赛结果公布后,则自然会打开的,不好意思哈
作者: lvpk    时间: 2013-06-19 00:33
本帖最后由 lvpk 于 2013-06-19 14:24 编辑
  1. CentOS release 5.3 (Final)
  2. GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)

  3. 第一题:

  4. awk '{print $NF}' illegal.log | sort -n  | uniq -c | sort -nr | head -n10
  5.      70 220.250.52.66
  6.      36 220.250.58.170
  7.      30 220.250.58.171
  8.      29 220.250.52.90
  9.      28 220.250.58.172
  10.      27 142.4.117.83
  11.      23 111.73.45.13
  12.      22 222.186.26.26
  13.      19 74.91.23.27
  14.      16 91.237.249.67


  15. 第二题:
  16. #!/bin/sh
  17. export TZ=EST
  18. #DATE_BF_TEN=`date -d "10 minute ago" +"%b %d, %Y%l:%M:[0-9][0-9] %p"`
  19. DATE_BF_TEN=`date -d "Mar 28, 2013 7:46:51 PM EST" +"%b %d, %Y%l:%M:[0-9][0-9] %p"`
  20. FILENAME="wsl.log"
  21. TMP_FILE=`mktemp`
  22. awk "/$DATE_BF_TEN/{a=1}a"  ${FILENAME} |grep '<Error>' && echo "${FILENAME} has log" | mutt -s "ERROR LOG"  "admin@ChinaUnix.net"

  23. 第三题:

  24. #!/bin/sh

  25. WEEK=`date +"%w"`
  26. WEWKS=`date +"%W"`
  27. IPNET='192.168.1.'
  28. RDIR='/opt/WebSphere/AppServer/profiles/'
  29. LDIR='/var/ChinaUnix'
  30. IGORE="bin logs *.log "
  31. TAR_NAME=''

  32. [ -d $LDIR/$WEEK ] || mkdir $LDIR/$WEEK


  33. case $WEEK in
  34.         1,2,3,4,5,6)
  35.                 TAR_NAME=${WEEKS}.tar;;
  36.         7)
  37.                 TAR_NAME=${WEEKS}_FULL.tar;;
  38. esac

  39. for IP in `seq 3 100` ;
  40. do
  41.         ssh ${IPNET}${IP} -- "tar uvf /tmp/${IPNET}${IP}${TAR_NAME} /opt/WebSphere/AppServer/profiles/ --exclude=bin --exclude=logs --exclude=bin --exclude=*.log --exclude=*heapdump* --exclude=*.gz --exclude=*.tar --exclude=*.zip --exclude=*.bak && zip /tmp/${IPNET}${IP}${TAR_NAME}.gz /tmp/${IPNET}${IP}${TAR_NAME}"

  42.         scp ${IPNET}${IP}:/tmp/${IPNET}${IP}${TAR_NAME}.gz $LDIR/${WEEK}
  43.         tar tzvf $LDIR/${WEEK}/${IPNET}${IP}${TAR_NAME}.gz
  44.         [ $? -eq 0 ] && echo "${IP} OK"
  45. done

  46. 第四题:

  47. command1 && command2 || command3
  48. 等同于
  49. if command1
  50. then
  51.   command2
  52.   if [ $? -ne 0 ] ;
  53.   then
  54.     command3
  55.   fi
  56. else
  57.   command3
  58. fi

  59. 1和2任意一个结果为false都执行3
  60. if语句假如1为true在执行2后不考虑结果,不再执行3



  61. 第五题:
  62. echo  -e "1234 \n 2343235 \n 3333" | awk '{for(i=1;i<=length($0);i++){rst[NR]=rst[NR]+substr($0,i,1)}}END{for(var in rst){print rst[var]}}'
  63. 10
  64. 22
  65. 12


  66. 第六题:

  67. 1、date --date="2013-05-23" +"%j"
  68. 2、date --date="2013-05-23 1 day ago"

  69. 第八题:
  70. 可以删除带空格的文件
  71. *      All of the words but the zeroth.  This is a synonym for ‘1-$’.  It is not an error to use *  if
  72.               there is just one word in the event; the empty string is returned in that case.

  73. 第九题:
  74. [db2inst1@db2srv1 ~]$ pwd
  75. /home/db2inst1
  76. [db2inst1@db2srv1 ~]$ echo ${PWD/2/3}_{1,2,3}
  77. /home/db3inst1_1 /home/db3inst1_2 /home/db3inst1_3


  78. 第十题:
  79. 1、ls | grep -v 20130605

  80. 2、ls | while read i; do mv "$i" "`echo "$i" | tr -d ' []'`"  ; done

  81. 3、
  82. for i in ` cd dirA && ls ` ;
  83. do
  84. [[ -f dirB/${i} ]] && rm -rf dirB/${i} ;
  85. done

  86. 4、
  87. for i in `find . -name "*.che" -exec basename {} \;` ;
  88. do
  89.   find . -name ${i%.che}.XQF -exec ls $i \;;
  90. done

  91. 5、
  92. che=`find . -name  "*.che"` ;\
  93. for i in $che ; \
  94.   do find . -name "`basename ${i%.che}.XQF`" -exec rm -rf ${i} \;;
  95. done
复制代码

作者: 井蛙夏虫    时间: 2013-06-19 00:41
第四题
当command1成功,command2失败的情况下,第一个会执行command1;command2;command3,
而第二个只会执行command1;command2
作者: 井蛙夏虫    时间: 2013-06-19 00:43
第五题
  1. echo "1234" | awk 'BEGIN{FS=""}{for(i=1;i<=NF;++i)a+=$i; print a}'
复制代码

作者: 井蛙夏虫    时间: 2013-06-19 00:46
第八题
可以,因为单词拆分在文件名扩展之前进行
作者: 井蛙夏虫    时间: 2013-06-19 00:48
第九题
  1. TEST=*;ls $TEST
复制代码

作者: kernel69    时间: 2013-06-19 01:31
  1. 1. perl -lane '$h{@F[-1]}++;END{map{print "$_\t$h{$_}"} sort{$h{$b}<=>$h{$a}} keys %h}' illegal.log |head


  2. 4. command1 && command2 || command3
  3. 只有command1和command2都为真,||第一部分才为真,不然执行command3

  4. if command1
  5. then
  6.   command2
  7. else
  8.   command3
  9. fi

  10. 只要command1为真就执行command2,不然执行command3


  11. 5. 给出一个多位数,算出其每位数的总和。比如 1234, 得到 10
  12. echo 1234|perl -le 'map{$sum+=$_;END{print $sum}} split //,<>'




  13. 8. [bash]如果当前目录下存在文件名包含空格(space)的文件,rm *可以删除它吗?为什么?
  14. 可以,因为*是通配符,代表任何字符



  15. 10.
  16.         1.ls|perl -ne '!/^20130605/ and print'
  17.         2.perl -e 'for(glob "*"){$n=$_;$n=~s/[ \[\]]+//g;rename $_,$n}'
  18.        
复制代码

作者: send_linux    时间: 2013-06-19 07:36
kernel69 发表于 2013-06-19 01:31


谢谢参与!
作者: 永夜之魂    时间: 2013-06-19 08:04
本帖最后由 永夜之魂 于 2013-07-22 14:05 编辑

1.
  1. awk '{print $NF}' illegal.log |sort -r|uniq -c|sort -rn | head -10
复制代码
2.这里先说一下个人的看法,因为日志超过1G,因此假定,每一分钟都在写入log,这里参照本番环境的log来处理
  1. #!/bin/sh
  2. _time1=`date -d '-10min' "+%b %-d, %Y %-I:%M:[0-5][0-9] %p"`         
  3. _time2=`date "+%b %-d, %Y %-I:%M:[0-5][0-9] %p"`
  4. _dir=/home/test
  5. _tmp1=/tmp/00.tmp
  6. _tmp2=/tmp/01.tmp

  7. cd $_dir/
  8. awk '/$_time1/{p=1}/$_time2/{p=0}p' wls_ms1.out |egrep -iw 'error|critical' -A20 > $_tmp2
  9. echo -e "To: admin@ChinaUnix.net" > $_tmp1
  10. if [ -f $_tmp2 ]                                                     
  11.    then                                                              
  12.        echo -e "Subject: You need check it at $_time2" >> $_tmp1
  13.        cat $_tmp2 >> $_tmp1
  14.        cat $_tmp1 | /usr/sbin/sendmail -t
  15.        rm -rf {$_tmp1,$_tmp2}  
  16.    else                                                              
  17.        exit
  18. fi
复制代码
3.
  1. #!/bin/sh
  2. _dir1=/opt/WebSphere/AppServer/profiles
  3. _dir2="/var/ChinaUnix"
  4. _time=date "+%a"

  5. if [ $_time != "Sun" ]
  6. then
  7.         for x in {3..100}
  8.                 do echo $x
  9.                 ssh 192.168.1.$x "tar -czvpf $_dir1/`date "+%Y%m%d"`_incre.tar.gz -g $_dir1/`date "+%Y%m%d"`_tarinfo $_dir1/ --exclude=$_dir1/bin --exclude=$_dir1/logs --exclude="*.log" --exclude="*heapdump*" --exclude="*.gz" --exclude="*.tar" --exclude="*.zip" --exclude="*.bak" --exclude="*.tar.gz" --exclude="*_tarinfo""
  10.         done
  11. else
  12.         for x in {3..100}
  13.                 do echo $x
  14.                 ssh 192.168.1.$x "tar -zcvf $_dir1/`date "+%Y%m%d"`_incre.tar.gz $_dir1/ --exclude=$_dir1/bin --exclude=$_dir1/logs --exclude="*.log" --exclude="*heapdump*" --exclude="*.gz" --exclude="*.tar" --exclude="*.zip" --exclude="*.bak" --exclude="*.tar.gz" --exclude="*_tarinfo""
  15.         done
  16. fi

  17. for x in {3..100};do echo $x;mkdir -p $_dir2/192.168.1.$x && scp root@192.168.1.$x:$_dir1/{`date "+%Y%m%d"`_incre.tar.gz,`date "+%Y%m%d"`_tarinfo} $_dir2/192.168.1.$x/;done
复制代码
4.
  1. 第一条是command1和command2的真假共同构成了判断条件,二者有任意一个不为真则执行command3;二者皆为真则执行 command1 && command2
  2. 第二条command1作为唯一判定条件,若为真,结果为command2;若为假,结果为command3
复制代码
5.
  1. echo "1234" |awk '{split($0,a,"");print a[1]+a[2]+a[3]+a[4]}'
复制代码
6.
  1. [root@server test]# awk --version
  2. GNU Awk 3.1.7

  3. #!/bin/sh
  4. echo -e "Please input 1;2"
  5. read a
  6. case $a in
  7. [1])
  8.         echo -e "Please input a date "
  9.         read b
  10.         #awk -v now=" $b" 'BEGIN{t1=mktime("2013 01 01 0 0 0");t2=mktime(now);print (t2-t1)/3600/24}'      #与下一行是同样的功能,但二者接受的输入不同
  11.         echo $b |awk  '{gsub(/-/," ",$0);t1=mktime("2013 01 00 0 0 0");t2=mktime($0" 0 0 0");print (t2-t1)/3600/24}'
  12.         #echo $b|awk '{gsub(/-/," ",$0);print strftime("%j",mktime($0" 00 00 00"))}'
  13. ;;
  14. [2])
  15.         echo -e "Please input a date "
  16.         read c
  17.         echo $c|awk '{gsub(/-/," ",$0);print strftime("%Y-%m-%d",mktime($0" 00 00 00")-24*3600)}'

  18. esac
复制代码
8.
  1. 可以删除,*代表匹配任何字符串包含空串。
复制代码
9.
  1. [root@server ~]# vim 00.sh
  2. #!/bin/bash

  3. x=00.txt
  4. touch ./$x


  5. [root@server ~]# sh -x 00.sh
  6. + x=00.txt
  7. + touch ./00.txt
复制代码

作者: send_linux    时间: 2013-06-19 09:18
永夜之魂 发表于 2013-06-19 08:04
1.2.这里先说一下个人的看法,因为日志超过1G,因此假定,每一分钟都在写入log,这里参照本番环境的log来处 ...


谢谢参与!
作者: gouxiongmao    时间: 2013-06-19 10:19
本帖最后由 gouxiongmao 于 2013-06-20 16:11 编辑

来晚了,我先占个地方。。

基于centos系统。。

第一题:
awk '{a[$NF]++};END{for(i in a)print a,i}' illegal.log|sort -nr|head -10

第二题:
#!/bin/bash

###=================
logf=wls_ms1.out            
logm=/tmp/wls_ms1.out.mir            
logl=/tmp/wls_ms1.out.lin
logt=/tmp/wls_ms1.out.tmp
loge=/tmp/wls_ms1.out.err

###================
if [[ ! -f $logf ]];then
  echo "ERR! no such file $logf."
  exit
fi
if [[ ! -f $logl ]];then
  touch $logl
  rm -f $logt $loge
  rsync -a $logf $logm
  wc -l $logm|awk '{print $1}' > $logl
  exit
fi

###===============
hfl=`tail -1 $logl`
rsync -a $logf $logm
cfl=`wc -l $logm|awk '{print $1}'`
crc=$(($cfl - $hfl))
if [[ $crc -eq 0 ]];then
  echo "no new logs."
elif [[ $crc -lt 0 ]];then
  echo "something wrong with log file $logf!"
else
  tail -$crc $logm >$logt
  awk '/ <Error> /' $logt>$loge
  if [[ -s $loge ]];then
    cat $loge|mail -s "found <Error> in log file" admin@ChinaUnix.net
  fi
  echo $cfl >>$logl
fi

第三题:
#!/bin/bash
###====================================
#rdir=/opt/WebSphere/AppServer/profiles/
ldir=/var/ChinaUnix/
cwk=`date +%w`

###====================================
fubak(){
  for i in {3..100};do
    ssh 192.168.1.$i "(cd /opt/WebSphere/AppServer/;tar --exclude=bin --exclude=logs --exclude=*.log --exclude=*heapdump* --exclude=*.gz --exclude=*.tar --exclude=*.zip --exclude=*.bak -g $i-bak -zcf - profiles/)"|cat >profiles-$i-full-bak.tgz
  done
}
apbak(){
  for i in {3..100};do
    ssh 192.168.1.$i "(cd /opt/WebSphere/AppServer/;tar --exclude=bin --exclude=logs --exclude=*.log --exclude=*heapdump* --exclude=*.gz --exclude=*.tar --exclude=*.zip --exclude=*.bak -g $i-bak -zcf - profiles/)"|cat >profiles-$i-p$1-bak.tgz
  done
}

###====================================
cd $ldir
if [[ `ls|grep 'full-bak.tgz'|wc -l` -ne 98 ]];then
  fubak
else
  case $cwk in
    0)
      fubak
      ;;
    1|2|3|4|5|6)
      apbak $cwk
      ;;
    *)
      echo "something wrong!"
      exit
      ;;
  esac
fi

第四题:
方法1在c2为假时依旧会执行c3,这点ifelse却不这么做。

第五题:
sum=0;for i in `echo 1234|sed 's#[0-9]#& #g'`;do sum=$(($i + sum));done;echo $sum

第六题:
1、awk 'BEGIN{dt="2013-05-23";gsub(/-/," ",dt);tt=dt" 0 0 0";ut=mktime(tt);print strftime("%j",ut)}'
2、awk 'BEGIN{print strftime("%Y-%m-%d",systime()-60*60*24)}'

第八题:
能删掉,bash扩展会自动给文件名加上双引号:
[root@appt3 tmpdir]# touch aaa\ asd
[root@appt3 tmpdir]# ll
总计 0
-rw-r--r-- 1 root root 0 06-20 10:47 aaa asd
[root@appt3 tmpdir]# rm *
rm:是否删除 一般空文件 “aaa asd”? y
[root@appt3 tmpdir]# ll
总计 0


作者: 代号:军刀    时间: 2013-06-19 11:10
本帖最后由 代号:军刀 于 2013-06-20 20:14 编辑

第七题:
1.结果能实现,程序的效率比较低,先贴上来,再想办法优化
  1. #!/bin/bash
  2. echo {1..9}{1..9}{1..9} | grep -oP '(?!(.)\1.|(.).\2|.(.)\3)\b\d+\b' > test
  3. awk '$0<865' test | while read  a
  4. do
  5.         grep -v '['$a']' test | while read b
  6.         do
  7.                 t=$(expr $a + $b)
  8.                 if [[ "$t" -gt "987" ]];then
  9.                         break
  10.                 fi
  11.                 grep -v '['$a$b']' test | awk '{if($0 == '$t')print '$a'"+"'$b'"="$0}'
  12.         done
  13. done
复制代码
2.跟步骤一其实都差不多的
  1. #!/bin/bash

  2. echo {1..9}{1..9}{1..9} | grep -oP '(?!(.)\1.|(.).\2|.(.)\3)\b\d+\b' > test
  3. awk -F "" '$1 % 2 == 0 && $2 % 2 == 0 && $3 % 2 != 0' test > test1    ##找出百分位十分位都为偶数,个位数为奇数
  4. awk -F "" '$1 % 2 != 0 && $2 % 2 != 0 && $3 % 2 != 0' test > test2    ##找出百分位十分位个位数都为奇数的
  5. while read a
  6. do
  7.         grep -v '['$a']' test1 | while read b
  8.         do
  9.                 grep -v '['$a$b']' test2| awk '{for(i=1;i<=3;i++){t+=(substr('$a',i,1)*100+substr('$b',i,1)*10+substr($0,i,1));if('$a'+'$b'+$
  10. 0+t == 4446)print '$a'"\n"'$b'"\n"$0"\n"};t=0}'
  11.         done

  12. done < test1
复制代码
运行结果:
  1. [root@ dir]$ ./ur.sh      
  2. 847
  3. 623
  4. 951

  5. 847
  6. 625
  7. 931

  8. 849
  9. 623
  10. 751

  11. 849
  12. 625
  13. 731

  14. 867
  15. 423
  16. 951

  17. 867
  18. 425
  19. 931

  20. 869
  21. 423
  22. 751

  23. 869
  24. 425
  25. 731
复制代码

作者: ljwd1000    时间: 2013-06-19 16:47
本帖最后由 ljwd1000 于 2013-06-25 17:53 编辑

就找会做了做了。。
  1. 1> awk '{a[$NF]++}END{for(i in a)print i,a[i]}' illegal.log | sort -k2 -nr | head -n 10

  2. 2>
  3. #!/bin/bash

  4. start_time=`date +"%b %d, %Y %l:%M %p" -d "10 minute ago"`
  5. now_time=`date +"%b %d, %Y %l:%M %p"`

  6. e_code=`awk '/"'$start_time'"/,/"'$now_time'"/{if($0~/<Error>/){print "error";exit}}'`

  7. if [ "$e_code" = "error" ]
  8. then
  9.     echo "error for wls_ms1.out" | mail -s "error" admin@chinaunix.net
  10. fi

  11. 3>


  12. 5> echo 1234 | awk -vFS="" '{for(i=1;i<=NF;i++)s+=$i}END{print s}'

  13. 6>
  14. time="2012-01-01"

  15. echo $time | awk '{gsub(/-/," ",$0);print strftime("%j",mktime($0" 00 00
  16. 00"))}'

  17. echo $time | awk '{gsub(/-/," ",$0);print strftime("%Y-%m-%d",mktime($0" 00 00
  18. 00")-24*3600)}'

  19. 7>
  20. 1. awk '{for(i=1;i<=NF;i++)a[i]=a[i]$i;gsub(/ +/,"",$0);b[NR]=$0}END{for(i in a)x=x+a[i]+b[i];print x}'

  21. 10>
  22. 1: ls -1| awk '!/^20130605/'
  23. 2: ls -1 | awk '{x=$0;gsub(/[ \]\[]/,"",$0);print "mv \047"x"\047 "$0}' | sh
  24. 3: awk 'NR==FNR{a[$0]=$0;next}($0 in a)' <(ls -1 dirB) <(ls -1 dirA) | xargs -i rm -f dirA/{}
  25. 4: find dirA dirB -type f -name "*.XQF" -o -name "*.che" | awk -F'[/.]' '{a[$2]++}END{for(i in a)if(a[i]>1)print i}' | xargs -i rm -f {dirA,dirB}/{}.che
复制代码

作者: liuzixinlzx    时间: 2013-06-19 17:34
第五题

#!/bin/sh
p=$1
len=`echo "${#p}"`

for i in `seq ${len}`
do
    var=`echo $p|cut -c $i`
    result=$((result+${var}))
done

echo $result
作者: liuzixinlzx    时间: 2013-06-19 17:38
第八题

能删除,rm能识别出来有空格的文件
作者: haigui815    时间: 2013-06-19 17:42
本帖最后由 haigui815 于 2013-06-19 17:47 编辑

总于把第一题做出来了。有意思,继续努力做下面的题。
第一题:cat illegal.log |tr -t "\t" " "|tr -s " "|awk  '{print $NF}'|sort -n|uniq -cd|sort -n|tail -10
作者: liuzixinlzx    时间: 2013-06-19 17:45
第六题

#!/bin/sh
for i in `seq ${#1}`
do
    result=$((result+`echo $1|cut -c $i`))
done
echo $result
作者: seesea2517    时间: 2013-06-19 17:53
呀,有比赛,今天忙晕头了下午才上论坛看到。
作者: send_linux    时间: 2013-06-19 17:57
seesea2517 发表于 2013-06-19 17:53
呀,有比赛,今天忙晕头了下午才上论坛看到。


欢迎参与,还早呢,呵呵
作者: quanzhou722    时间: 2013-06-19 18:17
1题目

awk '{a[$NF]++;}END{for (i in a){print i"\t"a} }' illegal.log |sort -k2nr|head
awk '{print $NF}' illegal.log |sort |uniq -c |sort -k1nr|head


第二题

b=`date +%s`
list=`awk -F'<Error>' '/\<Error\>/{print $1}' wls_ms1.out |sed 's/[<>]//g'|xargs -i -t date -d "{}" +%s`
for a in $list
do
c=`expr $b - $a`
if [ $c -lt 600 ];then
echo 错误| /bin/mail -s "错误" admin@ChinaUnix.net
fi
done

第三题

备份容易,不了解增量。。。。


第四题
command1 && command2 || command3
这种方式,如果command2 执行返回不为真也会执行command3
if的方式就只会执行2或3中的一个


第五题
echo 1234 |awk -F '' '{ for(i=1;i<NF+1;i++)a+=$i  ;print a}'


第六题
a=`date +%Y%m%d`
date -s 20130523 +%j
date -s $a

第七题

算法过。。。

第八题

可以删除 *代表所有

第九题

不清楚

第十题

1、
ls |grep -v 20130605

2、
ls |xargs -i -t rename [ "" {}
ls |xargs -i -t rename ] "" {}
ls |xargs -i -t rename " " "" {}


3、4题目
怎么算重复?删除是两个都删除?
作者: spzhangfei    时间: 2013-06-19 18:40
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\"")
        }
}'
###########################################################
作者: Shell_HAT    时间: 2013-06-19 18:43
只有shell版主可以看到所有回帖内容?还是所有版主都能看到回帖内容?
@send_linux
作者: wenhq    时间: 2013-06-19 19:06
第一题:
awk '{print $NF}'|sort|uniq -c|head -10
第二题:
#!/bin/bash

DATE_10_MIN_AGO=`date -d '10 minutes ago' '+%a %d, %Y %H:%M:%S'`
START_NUM=`grep -n "$DATE_10_MIN_AGO" /data/log/wls_ms1.out|head -1`
if [ -z $START_NUM ]; then
        ERROR_NUM=0

else
        END_NUM=`cat -n /data/log/wls_ms1.out|tail -1|awk '{print $1}'`
        DISC=`expr $END_NUM - $START_NUM + 1`
        ERROR_NUM=`cat -n /data/log/wls_ms1.out|tail -$DISC|grep  -w '<Error>'|wc -l`
        
fi

if [ $ERROR_NUM = 0 ] ; then
        echo "There is no error information in last 10mins."
else
        /usr/local/bin/sendEmail -f alert_send@mailhost.com -t admin@ChinaUnix.net  -u "Argent: Error LOG" -m "There haves $ERROR_NUM error(s)"
fi

第三题        
#!/bin/bash

PATH=/opt/WebSphere/AppServer
LPATH=/var/ChinaUnix
echo   -e "*.log\n*heapdump*\n*.gz\n*.tar\n*.zip\n*.bak" > excludefile
for i in `seq 3 100`; do
DATE=`date +%w`
NOW=`date +%Y%m%d`
IP=192.168.1.${i}
FILENAME=${IP}_${NOW}
  case ${DATE} in
   0)
    ssh root@${IP} 'cd ${PATH};tar -zcvf  ${FILENAME}_full.tar.gz ${PATH}/profiles  -X excludefile --exclude=profile/bin  --exclude=profile/logs'
    scp ${IP}{PATH}/${FILENAME}_full.tar.gz ${LPATH}/
    ;;
   1|2|3|4|5|6)
    ssh root@${IP} 'cd ${PATH};tar -g king -zcvf  ${FILENAME}_increment_${DATE}.tar.gz ${PATH}/profiles  -X excludefile --exclude=profile/bin --exclude=profile/logs'
    scp ${IP}{PATH}/${FILENAME}_increment_${DATE}.tar.gz ${LPATH}/
    ;;
  esac
done
  
第四题
2个命令的效果是一样的.
command1 && command2 || command3
这个会执行command1如果成功执行command2如果失败执行command3
if command1
then
  command2
else
  command3
fi

这个会执行command1如果成功执行command2如果失败执行command3
第五题
echo "1234">/abcd;awk '{l=length;for(i=1;i<=l;i++) a+=substr($0,i,1)}END{print a}'  /abcd
第六题
1.date +%j
2.yesterday=`TZ=$TZ+num date +%Y%m%d`;echo ${yesterday}##hpux
第七题
感觉是算法的题。求大拿。
第八题

不可以。如果遇到—foo\ c之类的文件是删不掉的。rm -rf 是删不掉以-开头的文件。

第九题
pathname expansion 就是所谓的 wildcard 扩展。可以在CLI执行比如ls -l f*
而parameter expansion是指以$开头的变量如${parameter}。这类变量可以有替换,求长度,赋值等操作。
作者: send_linux    时间: 2013-06-19 20:58
Shell_HAT 发表于 2013-06-19 18:43
只有shell版主可以看到所有回帖内容?还是所有版主都能看到回帖内容?
@send_linux


我找个别的版的版主看看,稍等哈
作者: lvpk    时间: 2013-06-19 21:29
  1. CentOS release 5.3 (Final)
  2. GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)

  3. 第一题:

  4. awk '{print $NF}' illegal.log | sort -n  | uniq -c | sort -nr | head -n10
  5.      70 220.250.52.66
  6.      36 220.250.58.170
  7.      30 220.250.58.171
  8.      29 220.250.52.90
  9.      28 220.250.58.172
  10.      27 142.4.117.83
  11.      23 111.73.45.13
  12.      22 222.186.26.26
  13.      19 74.91.23.27
  14.      16 91.237.249.67


  15. 第二题:
  16. #!/bin/sh
  17. export TZ=EST
  18. #DATE_BF_TEN=`date -d "10 minute ago" +"%b %d, %Y%l:%M:[0-9][0-9] %p"`
  19. DATE_BF_TEN=`date -d "Mar 28, 2013 7:46:51 PM EST" +"%b %d, %Y%l:%M:[0-9][0-9] %p"`
  20. FILENAME="wsl.log"
  21. TMP_FILE=`mktemp`
  22. awk "/$DATE_BF_TEN/{a=1}a"  ${FILENAME} |grep '<Error>' && echo "${FILENAME} has log" | mutt -s "ERROR LOG"  "admin@ChinaUnix.net"

  23. 第三题:

  24. #!/bin/sh

  25. WEEK=`date +"%w"`
  26. WEWKS=`date +"%W"`
  27. IPNET='192.168.1.'
  28. RDIR='/opt/WebSphere/AppServer/profiles/'
  29. LDIR='/var/ChinaUnix'
  30. IGORE="bin logs *.log "
  31. TAR_NAME=''

  32. [ -d $LDIR/$WEEK ] || mkdir $LDIR/$WEEK


  33. case $WEEK in
  34.         1,2,3,4,5,6)
  35.                 TAR_NAME=${WEEKS}.tar;;
  36.         7)
  37.                 TAR_NAME=${WEEKS}_FULL.tar;;
  38. esac

  39. for IP in `seq 3 100` ;
  40. do
  41.         ssh ${IPNET}${IP} -- "tar uvf /tmp/${IPNET}${IP}${TAR_NAME} /opt/WebSphere/AppServer/profiles/ --exclude=bin --exclude=logs --exclude=bin --exclude=*.log --exclude=*heapdump* --exclude=*.gz --exclude=*.tar --exclude=*.zip --exclude=*.bak && zip /tmp/${IPNET}${IP}${TAR_NAME}.gz /tmp/${IPNET}${IP}${TAR_NAME}"

  42.         scp ${IPNET}${IP}:/tmp/${IPNET}${IP}${TAR_NAME}.gz $LDIR/${WEEK}
  43.         tar tzvf $LDIR/${WEEK}/${IPNET}${IP}${TAR_NAME}.gz
  44.         [ $? -eq 0 ] && echo "${IP} OK"
  45. done

  46. 第四题:

  47. command1 && command2 || command3
  48. 等同于
  49. if command1
  50. then
  51.   command2
  52.   if [ $? -ne 0 ] ;
  53.   then
  54.     command3
  55.   fi
  56. else
  57.   command3
  58. fi

  59. 1和2任意一个结果为false都执行3
  60. if语句假如1为true在执行2后不考虑结果,不再执行3



  61. 第五题:
  62. echo  -e "1234 \n 2343235 \n 3333" | awk '{for(i=1;i<=length($0);i++){rst[NR]=rst[NR]+substr($0,i,1)}}END{for(var in rst){print rst[var]}}'
  63. 10
  64. 22
  65. 12


  66. 第六题:

  67. 1、date --date="2013-05-23" +"%j"
  68. 2、date --date="2013-05-23 1 day ago"

  69. 第八题:
  70. 可以删除带空格的文件
  71. *      All of the words but the zeroth.  This is a synonym for ‘1-$’.  It is not an error to use *  if
  72.               there is just one word in the event; the empty string is returned in that case.

  73. 第九题:
  74. [db2inst1@db2srv1 ~]$ pwd
  75. /home/db2inst1
  76. [db2inst1@db2srv1 ~]$ echo ${PWD/2/3}_{1,2,3}
  77. /home/db3inst1_1 /home/db3inst1_2 /home/db3inst1_3


  78. 第十题:
  79. 1、ls | grep -v 20130605

  80. 2、ls | while read i; do mv "$i" "`echo "$i" | tr -d ' []'`"  ; done

  81. 3、
  82. for i in ` cd dirA && ls ` ;
  83. do
  84. [[ -f dirB/${i} ]] && rm -rf dirB/${i} ;
  85. done

  86. 4、
  87. for i in `find . -name "*.che" -exec basename {} \;` ;
  88. do
  89.   find . -name ${i%.che}.XQF -exec ls $i \;;
  90. done

  91. 5、
  92. che=`find . -name  "*.che"` ;\
  93. for i in $che ; \
  94.   do find . -name "`basename ${i%.che}.XQF`" -exec rm -rf ${i} \;;
  95. done
复制代码

作者: rucypli    时间: 2013-06-19 22:51
第五题

for i in `seq 100`; do echo "123456" | cut -b $i; done | awk '{a=a+$1}END{print a}'
作者: murdercool    时间: 2013-06-20 09:06
4) command1 && command2 || command3     command2为False时command3也执行?
作者: send_linux    时间: 2013-06-20 09:09
Shell_HAT 发表于 2013-06-19 18:43
只有shell版主可以看到所有回帖内容?还是所有版主都能看到回帖内容?
@send_linux


可以确定,别的版的版主看不到
作者: ooooldman    时间: 2013-06-20 10:41
本帖最后由 ooooldman 于 2013-06-25 22:01 编辑

Display Julian dates
作者: chenyx    时间: 2013-06-20 14:01
本帖最后由 chenyx 于 2013-06-20 14:02 编辑

1.
  1. awk '{print $NF}' illegal.log | sort | uniq -c | sort -n -k1 -r  | head -10
  2. awk '{print $NF}' illegal.log | sort | uniq -c | sort -n | tail -10
复制代码

作者: send_linux    时间: 2013-06-20 14:32
chenyx 发表于 2013-06-20 14:01
1.


哈哈,老兄也来参加这个活动啦
作者: cyaln    时间: 2013-06-20 14:38
本帖最后由 cyaln 于 2013-06-27 12:02 编辑

第一题

  1. #!/bin/bash
  2. awk -F '\t' '{print $6}' illegal.log | sort > newfile.log
  3. awk '{a[$0]++}END{for (b in a)print a[b],b}' newfile.log | sort -nr | head -n 10
  4. rm -rf newfile.log
复制代码

  1. ----------------------RESULT-------------------
  2. 70 220.250.52.66
  3. 36 220.250.58.170
  4. 30 220.250.58.171
  5. 29 220.250.52.90
  6. 28 220.250.58.172
  7. 27 142.4.117.83
  8. 23 111.73.45.13
  9. 22 222.186.26.26
  10. 19 74.91.23.27
  11. 16 91.237.249.67
复制代码
第二题

  1. #!/bin/bash
  2. f=/tmp/wls_ms1.out
  3. for n in 10 9 8 7 6 5 4 3 2 1
  4. do
  5.         m10=$(date -d "${n} minutes ago" "+%k:%M")
  6.         echo $m10
  7.         data=$(awk '/'"$m10"'/, /^b/{print $0}' $f  |grep 'Error')
  8.         if  [[   -n $data   ]]; then
  9.                 echo "$data" | mail -s 'Error'  admin@ChinaUnix.net
  10.                 exit 0
  11.         else
  12.                 :
  13.         fi
  14. done
复制代码
第三题
  1. we=$(data +%w)

  2. #差异备份
  3. cb () {
  4.         for n in $(seq 3 100)
  5.         do
  6.         ssh 192.168.1.${n} << EOF
  7.         find  /opt/WebSphere/AppServer/profiles   -mtime 1   -type f ! -name "*.log"    ! -name "*heapdump*" ! -name "*.gz" ! -name "*.tar" ! -name ".zip" ! -name "*.bak" |egrep -v  "/bin|/log" > /tmp/$.log
  8.         tar -cz -T /tmp/$.log  -f /tmp/$n.tar.gz
  9.         scp  /tmp/${n}.tar.gz  192.168.1.2:/var/ChinaUnix/
  10.         EOF
  11.         done
  12. }


  13. #完全备份
  14. wb () {
  15.         for n in $(seq 3 100)
  16.         do
  17.         ssh 192.168.1.${n} << EOF
  18.         find  /opt/WebSphere/AppServer/profiles     -type f ! -name "*.log"    ! -name "*heapdump*" ! -name "*.gz" ! -name "*.tar" ! -name ".zip" ! -name "*.bak" |egrep -v  "/bin|/log" > /tmp/$.log
  19.         tar -cz -T /tmp/$.log  -f /tmp/$n.tar.gz
  20.         scp  /tmp/${n}.tar.gz  192.168.1.2:/var/ChinaUnix/
  21.         EOF
  22.         done
  23. }

  24. if [[ "$we" -eq  0  ]]; then
  25.         wb
  26. else
  27.         cb
  28. fi
复制代码
第四题

  1. 1. command1 && command2 || command3 此种表达式是一个完整的判断,意味着command1 和command2 同时成立,如果有一个不成立,则执行command3
  2. 2. if command1 then command2 else command3 fi 此种表达式是一个if-else结构的,意味着若command1为真执行command2,反之command1为假执行command3.
复制代码
第五题

  1. #!/bin/bash
  2. declare -i rock=0
  3. NUM=$1
  4. for((i=0;i<${#NUM};i++));
  5. do
  6.     rock=rock+${NUM:$i:1};
  7.     echo $rock;
  8. done
复制代码

  1. ----------------------RESULT-----------------------
  2. ./script_name 12345
  3. 15
复制代码
第六题

  1. #!/bin/bash

  2. REFYR=1600   #refernce year
  3. MIY=12
  4. DIM=31

  5. day=
  6. month=
  7. year=

  8. Param_Error()
  9. {
  10.     echo "Usage: `basename $0` YYYY-[M]M-[D]D or your input invalid date"
  11.     echo "       (date must be after 1600-1-1)"
  12.     exit 99
  13. }

  14. # echo $1 | awk -F '-' '{print $1 $2 $3}'
  15. Parse_Date()
  16. {
  17.     dm=${1#**-}
  18.     month=${dm%-*}
  19.     day=${dm#*-}
  20.     year=${1%%-**}
  21. }

  22. check_date()
  23. {
  24.     if [ $year -le $REFYR ]; then
  25.         #echo "$year is invalid year."
  26.         Parse_Date
  27.     fi


  28.     if [ $month -le 0 -o $month -gt $MIY ]; then
  29.         #echo "$month is invalid month."
  30.         Parse_Date
  31.     fi

  32.     # Find out number of days in given month
  33.     case $month in
  34.         1) days=31;;
  35.         01) days=31;;
  36.         2) days=28 ;;
  37.         02) days=28 ;;
  38.         3) days=31 ;;
  39.         03) days=31 ;;
  40.         4) days=30 ;;
  41.         04) days=30 ;;
  42.         5) days=31 ;;
  43.         05) days=31 ;;
  44.         6) days=30 ;;
  45.         06) days=30 ;;
  46.         7) days=31 ;;
  47.         07) days=31 ;;
  48.         8) days=31 ;;
  49.         08) days=31 ;;
  50.         9) days=30 ;;
  51.         09) days=30 ;;
  52.         10) days=31 ;;
  53.         11) days=30 ;;
  54.         12) days=31 ;;
  55.         *) days=-1;;
  56.         esac

  57.         # find out if it is a leap year or not

  58.         if [ $month -eq 2 ]; then
  59.         # if it is feb month then only check of leap year
  60.             if [ $((year % 4)) -ne 0 ] ; then
  61.                 : #  not a leap year : means do nothing and use old value of days
  62.             elif [ $((year % 400)) -eq 0 ] ; then
  63.                 # yes, it's a leap year
  64.                 days=29
  65.             elif [ $((year % 100)) -eq 0 ] ; then
  66.                 : # not a leap year do nothing and use old value of days
  67.             else
  68.                 # it is a leap year
  69.                 days=29
  70.             fi
  71.         fi

  72.     if [ $day -le 0 -o $day -gt $days ]; then
  73.         #echo "$day is invalid day."
  74.         Parse_Date
  75.     fi

  76.     return $days
  77. }

  78. Parse_Date $1
  79. check_date $day $month $year

  80. ######### 6.1  calc days
  81. D=`cal -j $month $year | awk 'NR>2' | tr '\n' ' ' | awk -v t="$day" '{print $t}'`
  82. echo "Today is the $D days in this year!!!"

  83. ######### 6.2  calc yesterday
  84. if [ $day -gt 1 ]
  85. then
  86.     let "day = $day - 1"   
  87. else
  88.     if [ $month -gt 1 -a $month -ne 3 ]
  89.     then
  90.         let "month = $month -1"
  91.     elif [ $month -eq 1 ]
  92.     then
  93.         month=$MIY
  94.         day=$DIM
  95.         let "year = $year -1"
  96.         check_date $day $month $year
  97.     else
  98.         let "month = $month -1"
  99.         [ `echo $(($year%4==0&&$year%100!=0||$year%400==0))` -eq 1 ] && day=29 || day=28
  100.     fi
  101. fi

  102. yesterday=$year-$month-$day
  103. echo "Yesterday is $yesterday !!!"
复制代码

  1. ------------------------RESULT--------------------------
  2. ./script_name 2013-06-23
  3. Today is the 175 days in this year!!!
  4. Yesterday is 2012-06-22 !!!
复制代码
第七题

  1. 说明
  2. 1.程序中出现array=(8)。根据权重值,九宫格的第一行第一列的值为7or8,由于  需要满足题目的另外一个要求,所以这里必须为8. (权重计算: 1.1 200 1.2 110 1.3 101 2.1 110 2.2 20 2.3 11 3.1 101 3.2 11 3.3 2 由于4446是指定的结果,可以当做极限值. 故1.1的值范围200*x>4446/666*200,x=7 or 8)
  3. 2.程序中出现array[${#array[@]}+1]=1。根据行、列值必须是奇数,所以1.3 2.3 3.1 3.2 3.3为奇数,而且1-9中所有奇数和的个位数为5,必须+1才为6.此时只有3.3是被多加了1次.故3.3也必须为1.
  4. 3.判断奇偶按位写是难点。
  5. 4.程序还是有不足的地方,就是array[1]的值恒为空,没时间弄了(女儿要睡觉了),求达人解惑。
  6. 5.求完美、高效答案
复制代码

  1. #!/bin/bash

  2. RANGE=10
  3. Rows=3
  4. Columns=3
  5. TOP=9
  6. declare -a array
  7. declare -a alpha
  8. declare -a a=(3 5 7 9)
  9. declare -a b=(8 7 4)
  10. declare -a c=(6 5 3)

  11. # 按位计算
  12. cal()
  13. {
  14.     let "sum = ${array[0]}*200 + ${array[2]}*110 + ${array[3]}*101 + ${array[4]}*110 + ${array[5]}*20 + ${array[6]}*11 + ${array[7]}*101 + ${array[8]}*11 + ${array[9]}*2"
  15. }

  16. #将计算的值按位进栈
  17. push()
  18. {
  19.     until [ $# -eq 0 ]
  20.     do
  21.         let "TOP = $TOP - 1"
  22.         if [ -z $1 ]
  23.         then
  24.             :
  25.         else
  26.             array[$TOP]=$1
  27.         fi
  28.         shift
  29.     done
  30.     return
  31. }

  32. create_array()
  33. {
  34.     array=(8)
  35.     [ -f array.file ] && rm -rf array.file
  36.     while :
  37.     do
  38.         let "i = $RANDOM*$RANGE/32767"
  39.         if [[ "${a[@]}" =~ "$i" ]]
  40.         then
  41.             T=1
  42.         else
  43.             T=0
  44.         fi
  45.         if [[ "$i" -ne "0" && "$i" -ne "1" && "$i" -ne "10" ]]
  46.         then
  47.             if [[ "${array[@]}" =~ "$i" ]]
  48.             then
  49.                 :
  50.             elif [ "$T" -eq "1" ]
  51.             then
  52.                 #奇数
  53.                 lno=`echo ${!array[@]} | awk '{print $2}'`
  54.                 if [[ "${b[@]}" =~ "$lno" ]]
  55.                 then
  56.                         push $i
  57.                 fi
  58.             else
  59.                 #偶数
  60.                 lno=`echo ${!array[@]} | awk '{print $2}'`
  61.                 if [[ "${c[@]}" =~ "$lno" && ! -z "$lno" ]]
  62.                     then
  63.                         push $i
  64.                 fi
  65.             fi
  66.         fi
  67.     [ ${#array[@]} -eq 8 ] && break
  68.     done
  69.     array[${#array[@]}+1]=1
  70.     for ((i=0; i<=${#array[@]}; i++))
  71.     do
  72.         echo ${array[$i]} >> array.file
  73.     done
  74.     TOP=9
  75. }

  76. # copy from : advance bash program 26-16
  77. load_alpha()
  78. {
  79.     local rc=0
  80.     local index

  81.     for i in `cat array.file`
  82.     do
  83.         local row=`expr $rc / $Columns`
  84.         local column=`expr $rc % $Rows`
  85.         let "index = $row * $Rows + $column"
  86.         alpha[$index]=$i
  87.         let "rc += 1"
  88.     done
  89. }
  90. # copy from : advance bash program 26-16
  91. print_alpha()
  92. {
  93.     local row=0
  94.     local index

  95.     echo

  96.     while [ "$row" -lt "$Rows" ]
  97.     do
  98.         local column=0
  99.         echo -n " "
  100.         while [ "$column" -lt "$Columns" ]
  101.         do
  102.             let "index = $row * $Rows + $column"
  103.             echo -n "${alpha[index]}"
  104.             let "column += 1"
  105.         done

  106.         let "row += 1"
  107.         echo
  108.     done
  109.     echo
  110. }

  111. main()
  112. {
  113.     while :
  114.     do
  115.         create_array
  116.         load_alpha
  117.         cal
  118.         if [ "$sum" == "4446" ]
  119.         then
  120.             print_alpha
  121.             break
  122.         else
  123.             :
  124.         fi
  125.     done
  126. }

  127. for ((i=0;i<2;i++))
  128. do
  129.     main >> result.log
  130. done

  131. awk 'BEGIN{RS='\n';ORS="\n\n";OFS=FS="\n";}{c[$0]++}END{for (b in c)print b}' result.log
  132. rm -f array.file
复制代码

  1. ---------------------------RESULT---------------------------
  2. 869      849      847      867      847      849      867      869      
  3. 423      623      623      423      625      625      425      425
  4. 751      751      951      951      931      931      931      731
复制代码
第八题

  1. 可以删除. 因为*是通配符,匹配0个或多个.而有空格的文件,一般会以反斜杠加空格的表示空格 [redhat 2.6.18-194.el5 验证]
复制代码
第九题

  1. bash执行的数序就是如下:
  2. brace expansion,
  3. tilde expansion,
  4. parameter、variable、arithmetic expansion 、command substitution
  5. word splitting
  6. pathname expansion

  7. 例子:
  8. echo "${!var^^}"
  9. # ...is equivalent to
  10. eval 'echo "${'"$var"'^^}"'
复制代码
第十题

  1. 1. ls | grep -v  '^20130605'
  2. 2. for ((i=1;i<`ls | wc -l`;i++));do mv   "$(ls |sed  -n ${i}p)"  "$(ls |sed  -n ${i}p|sed  -e  's/\[//g' -e 's/\]//g' -e 's/ //g' )";done
  3. 3.
  4. #!/bin/bash
  5. for n in $(ls dirA)
  6. do
  7. if [[ -f dirA/${n} && -f dirB/${n} ]]
  8. then
  9.     diff dirA/${n} dirB/${n} >/dev/null
  10.     if [ "$?" -eq 0 ]
  11.     then
  12.         rm -rf dirB/${n}
  13.     else
  14.         :
  15.     fi
  16. fi
  17. done
  18. 4.
  19. #!/bin/bash
  20. for n in  $(ls dira/ dirb/ |awk '!/dirb\/:|dira\/:/{print $0}')
  21. do
  22.     m=$(echo $n |awk -F '.' '/XQF$/{print $1}')
  23.     rm -f dira/${m}.che
  24.     rm -f dirb/${m}.che
  25. done
复制代码

作者: send_linux    时间: 2013-06-20 14:39
cyaln 发表于 2013-06-20 14:38
第一题
第二题
第三题


谢谢参与!
作者: zhaopingzi    时间: 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"
复制代码

作者: gouxiongmao    时间: 2013-06-20 18:10
第七题怎么砍掉了一个?算了半天才算出来。。。
作者: rucypli    时间: 2013-06-20 18:14
第四题   区别在于如果command1是真command2是假 则第一个表达式是执行command3  第二个不执行
作者: ssfjhh    时间: 2013-06-21 06:22
没python不开心。
作者: rdcwayx    时间: 2013-06-21 06:55
gouxiongmao 发表于 2013-06-20 20:10
第七题怎么砍掉了一个?算了半天才算出来。。。

你如果已经完成的差不多的话,就贴上来,算附加分。
作者: send_linux    时间: 2013-06-21 08:50
ssfjhh 发表于 2013-06-21 06:22
没python不开心。


兄弟用的是啥客户端?
iOS的还是Android的啊?还是直接wap上的啊?
作者: spzhangfei    时间: 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")}'  
############################################################
作者: spzhangfei    时间: 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]#
################################################################################

作者: dt2310    时间: 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
复制代码

作者: cd_chair    时间: 2013-06-22 21:28
提示: 作者被禁止或删除 内容自动屏蔽
作者: send_linux    时间: 2013-06-23 20:41
cd_chair 发表于 2013-06-22 21:28
作为SHELL版游客也有两年多了,水平也就那样。从没回过贴,这次只挑了自己觉得会的,版主及各位大牛见笑了
...



潜水两年了,谢谢兄弟给面子哈,参与这次活动了,呵呵
作者: wangyue9014    时间: 2013-06-24 10:31
第一题
awk '{a[$6]++}END{for(i in a){if(a[i]>2)print a[i],i}}' illegal.log | sort -k1nr | head
作者: dc222222222    时间: 2013-06-24 14:17
[ 第5题]:
用cut取出每位上的数字,循环求和即可,代码如下:
  1. #!/bin/bash
  2. read -p "请输入一个数字:" num
  3. counts=`echo $num | wc  -m`
  4. num_counts=`expr $counts - 1`
  5. sum=0
  6. for i in `seq $num_counts`
  7. do
  8.         s=`echo $num | cut -c $i`
  9.         sum=`expr $sum + $s`
  10. done
  11. echo "各位上的和为:$sum"
复制代码

作者: dc222222222    时间: 2013-06-24 14:22
[第4题]:
先看第二个if--esle的表达式,该表达是只用判断if后面的表达式,决定接下来执行哪一个分支。
第一个表达式,同样是先判断第一个表达式,不同的是,如果决定执行第二个表达式的话,还会判断第二个表达式,决定是否执行第三个表达式。
作者: send_linux    时间: 2013-06-24 19:05
dc222222222 发表于 2013-06-24 14:22
[第4题]:
先看第二个if--esle的表达式,该表达是只用判断if后面的表达式,决定接下来执行哪一个分支。
第 ...


欢迎参与!
作者: yestreenstars    时间: 2013-06-25 14:18
同一个目录可能存在两个文件名相同的文件么?别告诉我后缀名不算文件名的一部分~
作者: xsdivern    时间: 2013-06-25 16:40
回复 1# send_linux
见识到了真正的shell应用、真心难!
1、有一小撮别有用心的人,他们会想办法获取论坛的用户名列表,然后用弱密码逐个尝试每一个用户名。针对这一情况,论坛程序会把每一次登陆失败的记录放在日志里面。请编写脚本找出尝试登陆失败次数最多的 top 10 的IP地址和登陆失败次数。测试数据见附件illegal.log
只能想到利用awk数组
awk -F'\t' '{ip[$6]++}END{for(i in ip){print i" "ip}}' illegal.log|sort -k 2nr|head -10
[u@H /billing/user/xufc]$awk -F'\t' '{ip[$6]++}END{for(i in ip){print i" "ip}}' illegal.log|sort -k 2nr|head -10
220.250.52.66 70
220.250.58.170 36
220.250.58.171 30
220.250.52.90 29
220.250.58.172 28
142.4.117.83 27
111.73.45.13 23
222.186.26.26 22
74.91.23.27 19
91.237.249.67 16

2请编写脚本监控日志文件中的关键字<Error>,一旦发现该关键字就马上发邮件给admin@ChinaUnix.net,样例数据见附件wls_ms1.out,要求如下:
(1)假设该脚本在crontab中每10分钟执行一次,每次运行时只检测最近十分钟之内的日志里面有没有出现关键字,十分钟之前的日志不要误报。
(2)样例数据仅供参考,实际日志文件比较大(比如1GB),请充分考虑代码效率。
(3)应用程序会实时地更新这个日志文件,因此不允许对该文件进行分割。
HP-UX,date求取10分钟之前的timeA做不出来;
timeA和日志文件格式中的时间点大小比较不好实现。
想到的思路、先找到当前时间前10分钟的时间点timeA;然后tac(没有tac文件、只能tail预估数量)文件传到awk命令
如果时间比timeA大就打印出来,时间比小于timeA,则awk直接退出。
此处假设10分钟之前timeA=7:58:45,那么应该实现大致如下:
tail -100 wls_ms1.out|awk -v timeA="7:58:45" '{if($4!~/[0-9]*:[0-9]*:[0-9]*/ &&flag==1){print} else if($4~/[0-9]*:[0-9]*:[0-9]*/ && $4>=timeA){flag=1;print} }'|grep '<Error>'|mail ...

3、请在本地机器192.168.1.2上编写脚本,把远程192.168.1.3 ~ 192.168.1.100每台机器上的某个文件夹打包压缩复制到本地作为备份
没有机器不写了、呵呵!想想打包排除某些文件就用find的相关命令。文件传送应该就是利用简历了信任关系来直接登陆吧

4.下面的两种表达有何不同:

command1 && command2 || command3

if command1
then
  command2
else
  command3
fi

前者的  command3执行是和 command2联系的,和command1没有关系。后者command1的执行结果决定command2和command3;
两者逻辑不一样;当command1执行错误、两者结果是一样的;但是command1执行正确时,前者、command3执行还是不执行就要看command2的执行结果了。后者不会执行command3.

5、给出一个多位数,算出其每位数的总和。比如 1234, 得到 10

[u@H /billing/user/xufc]$cat a2i_sum.sh
#!/usr/bin/ksh
number=$1
sum=0
while [[ ${number}/10 -ne 0 ]]
do
    sum=$((${number}%10 +  $sum))
    number=$((${number}/10))
done
sum=$((${number}%10 +  $sum))
echo ${sum}
[u@H /billing/user/xufc]$a2i_sum.sh 456
15

6-9、不会
10、会一点
   1、ls -l|grep -v ^20130605
   2、sed获取修改后的文件名、然后对应cp一下
   3、用sort、uniq命令可以实现集合的交集、并集和差集
   4、想到的方法就是集合循环处理了。





   
作者: float001    时间: 2013-06-25 17:04
支持   同志们加油了
作者: shreychen    时间: 2013-06-25 17:05
第一题:

grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' illegal.log |uniq -c|sort -nr
作者: shreychen    时间: 2013-06-25 17:12
第四题:
前者,只有当command1和command2都没有执行成功时才会执行command3
后者,当command1没有成功时执行command3
作者: shreychen    时间: 2013-06-25 17:28
第八题:可以
作者: shreychen    时间: 2013-06-25 17:49
第五题

脚本:
cat sum.sh
#!/bin/bash

num=$1

sum=0
while(($num))
do
    rs=$(($num%10))
    sum=$(($sum+$rs))
    num=$(($num/10))
done

echo $sum

执行:./sum.sh 1234
10
作者: zzfzqq    时间: 2013-06-25 18:10
系统环境:centos 6.3
脚本内容:
#!/bin/bash
#定义好变量
LOGIN_FILE="/tmp/illegal.log"
IP_LIST="/tmp/ip_list.txt"
IP_UNIQ="/tmp/ip_uniq.txt"
RESULT="/tmp/result.txt"
#每次运行此脚本,清空文件
>${IP_LIST}
>${IP_UNIQ}
>${RESULT}
# 由于ip所处的列并不统一,所以以大于或者等于最大列为上限即可,来遍历每一列中的存在的ip地址:
for i in `seq 1 10`
do
        awk  "{print \$$i}"   ${LOGIN_FILE}  |grep "[0-9][0-9]\.[0-9]" >> ${IP_LIST}
done
#第二个for循环:用来对ip地址去重复,统计每个ip地址的访问次数(即重复次数)

for i in `sort -u  ${IP_LIST}`
do
        num=`grep $i ${LOGIN_FILE}  |wc -l`;echo $i:  $num>> ${IP_UNIQ}
done  
#排序输出top10的结果
sort -r  -n -k 2 -t :  ${IP_UNIQ} | uniq  | head -n 10 > ${RESULT}
#输出结果格式 是  ip地址:登录失败次数
作者: luyanfei78    时间: 2013-06-25 22:19
第一题:
  1. cat illegal.log | awk '{count[$NF]++;} END{for(ip in count) print ip,count[ip];}' | sort -r -k 2,2 -n | head -10
复制代码

作者: wozeiwori    时间: 2013-06-25 23:15
本帖最后由 wozeiwori 于 2013-06-27 09:56 编辑

第一题
[root@bogon opt]# awk -F'\t' '{a[$6]++}END{for(i in a)print i,a}' illegal.log|sort -rnk2|head -10
220.250.52.66 70
220.250.58.170 36
220.250.58.171 30
220.250.52.90 29
220.250.58.172 28
142.4.117.83 27
111.73.45.13 23
222.186.26.26 22
74.91.23.27 19
91.237.249.67 16
第二题
#!/bin/bash
if [ ! -f /tmp/nr ];then j=1;else j=`cat $1`;fi
trig=`awk -vi=$j 'NR>=i&&/<Error>/' wls_ms1.out`
echo `awk 'END{print NR}' wls_ms1.out`>/tmp/nr
if [[ "$trig" != "" ]];then echo warning|mail admin@ChinaUnix.net -s warning;fi
*/10 * * * * /opt/jiance.sh /tmp/nr
第三题
#!/bin/bash
IPATH=/opt/WebSphere/AppServer/profiles
IFSUN=`date +"%w"`
SUF=`if [ $IFSUN -ne 0 ];then echo -ctime 1;fi`
FILE="find $IPATH $SUF|sed 's#$IPATH/bin.*##;s#$IPATH/logs.*##;/.*\.log$/d;/.*heapdump[^\/]*/d;/.*\.gz$/d;/.*\.tar$/d;/.*\.zip$/d;/.*\.bak$/d'"
file=FILE
DATE=`date +"%F"`
        for i in 192.168.1.{3..100}
                do
                eval ssh $i '\$$file|xargs tar cvf $DATE.tar;scp $DATE.tar 192.168.1.2:/var/ChinaUnix/'
                done
0 12 * * * /opt/scp.sh
第四题
下面的两种表达有何不同:
command1 && command2 || command3
if command1
then
  command2
else
  command3
fi
command1为真时command2为假时;第一种执行command3;第二种执行command2
第一种是一种平行关系,而第二种由command1决定了下面的命令执行
第五题
echo 3223232323|awk -F '' '{for(i=1;i<=NF;i++)a+=$i}END{print a}'
第六题
#!/bin/bash
read a b c<<<`echo $1|sed 's/-/ /g'`
FEB=` if [ ${a%4} -eq 0 ];then echo 29;else echo 28;fi`
TH=`echo "31 $FEB 31 30 31 30 31 31 30 31 30 31"|awk -vh=$a -vi=$b -vk=$c -vm=$c '{for(j=1;j<i;j++)s+=$j;k=k-1;if(k==0){i=i-1;k=$i;if(i==0){h=h-1;i=12;k=31}}}END{print s+m,h"-"i"-"k}'`
echo The day you\'ve input is the ${TH%% *}th day of this year!
echo Yesterday is ${TH##* }!
第七题
#!/bin/bash
J='{1,3,5,7,9}'
O='{2,4,6,8}'
GEN=`eval echo $J$J$J$J$J|sed -r 's/[^ ]*([^ ])[^ ]*\1[^ ]*//g'`
DIN=`eval echo $O$O$O$O|sed -r 's/[^ ]*([^ ])[^ ]*\1[^ ]*//g'`
for i in $GEN
do
        for j in $DIN
        do
                echo $i$j|awk -F '' '{A=$5$4$3;B=$8$9$2;C=$6$7$1;D=$1$2$3;E=$7$9$4;F=$6$8$5;if(A+B+C+D+E+F==4446){print C"\n"B"\n"A;print "--------------answer"}}'
        done
done
第八题
不可以,*首先匹配当前文件加下所有的文件名,附到rm后面,rm执行时将出错
第九题
[root@bogon Desktop]#  echo {1..4}{1..$a}
1{1..9} 2{1..9} 3{1..9} 4{1..9}可以看到在1..4展开的时候$a已经赋予变量了
由此可见变量展开比路径展开先
第十题
ls -1|awk '!/^20130605/'
#!/bin/bash
FILE=`find dirA dirB -type f`
for i in $FILE
do
        j=`echo "$i"|sed 's/[][ ,]//g'`
        mv "$i" $j
done
find dirA dirB -type f|awk -F'[\/]' 'a[$NF]++'|xargs rm -rf
find dirA dirB -type f|awk -F'[\/.]' 'a[$(NF-1)++]'|xargs -i rm  -rf {}.che

作者: shreychen    时间: 2013-06-26 09:05
第七题:
8 6 7
4 2 3
9 5 1
作者: send_linux    时间: 2013-06-26 09:13
wozeiwori 发表于 2013-06-25 23:15
第一题
[root@bogon opt]# awk -F'\t' '{a[$6]++}END{for(i in a)print i,a}' illegal.log|so ...

厉害,都答完了,恭喜。。。。
作者: lvpk    时间: 2013-06-26 11:47
第七题:
  1. date && time echo 1 | awk '{
  2. for(min=123456789;min<=987654321;min++){
  3.   a=substr(min,1,1);b=substr(min,2,1);c=substr(min,3,1);d=substr(min,4,1);e=substr(min,5,1);f=substr(min,6,1);g=substr(min,7,1);h=substr(min,8,1);i=substr(min,9,1)
  4.   ar[a]=a;ar[b]=b;ar[c]=c;ar[d]=d;ar[e]=e;ar[f]=f;ar[g]=g;ar[h]=h;ar[i]=i;delete ar[0];
  5.   if(length(ar)==9){
  6.    if((a*100+b*10+c)+(d*100+e*10+f)+(g*100+h*10+i)+(a*100+d*10+g)+(b*100+e*10+h)+(c*100+f*10+i)==2142){
  7.     print a b c"+"d e f"+"g h i"+"a d g"+"b e h"+"c f i"="4446 >> res.4446
  8.    }
  9.   }
  10. }
  11. }' && date
复制代码
Wed Jun 26 11:29:41 JST 2013

real    65m45.919s
user    65m10.666s
sys     0m3.967s
Wed Jun 26 12:35:27 JST 2013
作者: zzfzqq    时间: 2013-06-26 14:29
本帖最后由 zzfzqq 于 2013-06-26 14:32 编辑

第二题:
系统环境:centos 6.3
脚本实现:脚本采用对时间点的截取来获取十分钟的数据,利用awk的截取功能,仅对最后10分钟内的数据进行提取并分析,避免对整个大文件的数据遍历,提高效率。并不会出现误差
#!/bin/bash
WLS_MS1=/tmp/wls_ms1.out
TMP_FILE=/tmp/wls.txt
#下面三个变量分别获取的是 脚本执行时日志文件最后的时间: 小时、分钟 和 十分钟前的时间点 MINUTE_STAR
HOUR_END=$(awk END'{print $0}' wls_ms1.out |awk -F':' '{print $1}'|awk  '{print $3,$4}')
MINUTE_END=$(awk END'{print $0}' wls_ms1.out  |awk -F':' '{print $2}')
MINUTE_START=$(($MINUTE_END-10))
res=`grep "$HOUR_END:$MINUTE_START" $WLS_MS1`
#判断刚好十分钟前的内容(准确值)是否找到,如果找不到,将会在for语句中不断增加1(最高是10,因为不会超过10分钟的) 直到找到离准确值最近的十分钟内的内容   
if [ $? -eq 0 ]     
then

sed -n "/$HOUR_END:$MINUTE_START/,$ p" $WLS_MS1 > $TMP_FILE

else
        for i in `seq 1 11`
        do
                MINUTE_START2=$(($MINUTE_START+$i))
                rs=`grep "$HOUR_END:$MINUTE_START2" $WLS_MS1`
                if [ $? -eq 0 ]
                then
                        sed -n "/$HOUR_END:$MINUTE_START2/,$ p" $WLS_MS1 > $TMP_FILE
                        exit 0
                else
                        continue
                fi

        done
fi
#对10分钟内增加的内容进行关键字判断,并报警
ERROR=`grep "<Error>" $TMP_FILE`
if [ $? -eq 0 ]
then
        echo "`date +%y%m$d--%H:%M:%S`-Find the < Error > keyword" | mail -s "Find the < Error > keyword" mail@163.com
fi
作者: zzfzqq    时间: 2013-06-26 14:29
标题: 第二题
本帖最后由 zzfzqq 于 2013-06-26 14:34 编辑

第二题:
系统环境:centos 6.3
脚本实现:脚本采用对时间点的截取来获取十分钟的数据,利用awk的截取功能,仅对最后10分钟内的数据进行提取并分析,避免对整个大文件的数据遍历,提高效率。并不会出现误差
#!/bin/bash
WLS_MS1=/tmp/wls_ms1.out
TMP_FILE=/tmp/wls.txt
#下面三个变量分别获取的是 脚本执行时日志文件最后的时间: 小时、分钟 和 十分钟前的时间点 MINUTE_STAR
HOUR_END=$(awk END'{print $0}' wls_ms1.out |awk -F':' '{print $1}'|awk  '{print $3,$4}')
MINUTE_END=$(awk END'{print $0}' wls_ms1.out  |awk -F':' '{print $2}')
MINUTE_START=$(($MINUTE_END-10))
res=`grep "$HOUR_END:$MINUTE_START" $WLS_MS1`
#判断刚好十分钟前的内容(准确值)是否找到,如果找不到,将会在for语句中不断增加1(最高是10,因为不会超过10分钟的) 直到找到离准确值最近的十分钟内的内容
if [ $? -eq 0 ]     
then

sed -n "/$HOUR_END:$MINUTE_START/,$ p" $WLS_MS1 > $TMP_FILE

else
        for i in `seq 1 11`
        do
                MINUTE_START2=$(($MINUTE_START+$i))
                rs=`grep "$HOUR_END:$MINUTE_START2" $WLS_MS1`
                if [ $? -eq 0 ]
                then
                        sed -n "/$HOUR_END:$MINUTE_START2/,$ p" $WLS_MS1 > $TMP_FILE
                        exit 0
                else
                        continue
                fi

        done
fi
#对10分钟内增加的内容进行关键字判断,并报警
ERROR=`grep "<Error>" $TMP_FILE`
if [ $? -eq 0 ]
then
        echo "`date +%y%m$d--%H:%M:%S`-Find the < Error > keyword" | mail -s "Find the < Error > keyword" mail@163.com
fi
作者: helpid    时间: 2013-06-26 15:25
本帖最后由 helpid 于 2013-07-03 14:58 编辑

第一题: 使用awk可以快速的统计出TOP10的IP地址以及数量
方法1:
  1. awk '{a[$NF]++}END{for(i in a)print i,a[i]}' illegal.log | sort -k2nr | head
复制代码
方法2:
  1. awk '{a[b[$NF]++]}END{for(i=asort(a);i>0;i--)for(j in b)if(b[j]==i)print j" - "b[j]}' illegal.log | head
复制代码
第二题: 个人分析:
这个问题关键在于时间点的控制,通过观察日志,
我发现并不是每一秒或每一分钟都有日志产生的。所以
有可能在日志记录过程中,某个时间点或时间段就没有信息写入日志文件
那么:
A. 如果当前时间之前的10分钟这个时间点在日志中存在,
   则设定查找内容范围从这个时间点开始直到日志文件末尾。
B. 如果当前时间之前的10分钟这个时间点日志中不存在
   则查找距离这个时间点最近的一个时间,并且这个时间点必须为当前时间之前的10分钟以内的时间点
   查找内容内容页从这个时间点开始直到日志文件末尾
   
最后通过使用sed语句来筛选出10分钟以内的日志内容,并进行关键字搜寻
如果在这段日志内容中包含有<Error>关键字就读取出来写入文件再发送邮件
否则就正常退出

B情况暂时没想出来如何实现....   

A情况的处理方法:
第一步:编写脚本文件保存为 log_check.sh
# ========================================

  1. #!/bin/bash
  2. # log_check.sh
  3. stm="`date -d '-10 minutes'`"
  4. tag="<Error>"
  5. file="`mktemp`"
  6. sed -n "/${stm}/,/$/{/${tag}/p}" wls_ms1.out > ${file}
  7. [ -e ${file} ] && mail -s "Error" admin@ChinaUnix.net < ${file}
  8. rm -f  ${file}
复制代码
# =================END====================
第二步:编写计划任务
在当前用户下执行crontab -e添加计划任务:
  1. */10 * * * * /bin/bash log_check.sh
复制代码
第三题:我的思路是通过for循环来跑指定的IP段把所有不需要备份的目录及文件统一写到一个文件中,在执行tar打包时通过 -X参数来排除

  1. #!/bin/bash
  2. # Everyday 00:00:00 Run backup script.
  3. # 0 0 * * * /bin/bash /var/ChinaUnix/AppServerBackup.sh
  4. TODAY=`date +%Y%m%d`
  5. WEEKDAY=`date +%w`
  6. REMOTE_NETMASK=192.168.1  #  子网段
  7. REMOTE_IPS=(3 100)        #  子网IP
  8. REMOTE_BACKUP_PATH=/opt/WebSphere/AppServer/profiles/
  9. LOCAL_SAVE_PATH=/var/ChinaUnix/
  10. EXCLUDE_PATH=(bin logs)
  11. EXCLUDE_FILE=(*.log *heapdump* *.gz *.tar *.zip *.bak)
  12. EXCLUDE_FILENAME=exclude.file
  13. function PrintLogs()
  14. {
  15.         echo -e "<$(date +'%F %T')> $*"
  16. }

  17. function setBackupParts()
  18. {
  19.     case ${WEEKDAY} in
  20.         0)        args='-cjvpPf';;  # Full Backup
  21.     [1-6])        args='-ujvpPf';;  # Update Backup
  22.     esac
  23. }
  24. function setExcludeValue()
  25. {
  26.     if [ ! -e ${EXCLUDE_FILENAME} ]
  27.     then
  28.         echo "${EXCLUDE_PATH[@]} ${EXCLUDE_FILE[@]}" | xargs -n1 > ${EXCLUDE_FILENAME}
  29.     fi
  30. }

  31. function printResult
  32. {
  33.     PrintLogs "==================================="
  34.     PrintLogs "Bacup Success IP Total: ${SUCCESS}"
  35.     PrintLogs "Bacup Failure IP Total: ${FAILURE}"
  36.     if [ ${FAILURE} -gt 0 ]
  37.     then
  38.         for i in ${FAILURE_IPS}
  39.         do
  40.             PrintLogs "${i}"
  41.         done
  42.     fi
  43.     echo "==================================="
  44. }

  45. function backupFile()
  46. {
  47.     echo "Start Backup."
  48.     # 设置备份参数
  49.     setBackupParts
  50.     # 设置排除文件
  51.     setExcludeValue
  52.    
  53.     for((i=${REMOTE_IPS[0]};i<=${REMOTE_IPS[1]};i++))
  54.     do
  55.         ip=${REMOTE_NETMASK}.${i}
  56.         file=${TODAY}_${ip}.tar.bz2

  57.         ssh ${ip} "test -f ${EXCLUDE_FILENAME}"                                          &>/dev/null
  58.         [ $? -ne 0 ] && scp ${EXCLUDE_FILENAME} ${ip}                                    &>/dev/null
  59.         
  60.         ssh ${ip} "test -d ${REMOTE_BACKUP_PATH}"                                        &>/dev/null
  61.         if [ $? -eq 0 ]
  62.         then
  63.             ssh ${ip} "tar ${args} -X ${EXCLUDE_FILENAME} ${file} ${REMOTE_BACKUP_PATH}" &>/dev/null
  64.             scp ${ip}:${file} ${local_save_path}                                         &>/dev/null
  65.             ssh ${ip} "rm -f ${file}"                                                    &>/dev/null
  66.             PrintLogs "${ip} done"
  67.             ((SUCCESS++))
  68.         else
  69.             FAILURE_IPS="${ip} ${FAILURE_IPS} "
  70.             ((FAILURE++))
  71.             continue
  72.         fi
  73.     done
  74.     PrintLogs "Backup End."
  75.    
  76.     # 输出备份结果
  77.     printResult
  78. }

  79. SUCCESS=0      # 操作成功计数器
  80. FAILURE=0      # 操作失败计数器
  81. FAILURE_IPS=""
  82. USED_TIME=0    # 流程耗时计算器

  83. # 执行文件备份
  84. backupFile
复制代码
在当前用户下执行crontab -e添加计划任务:
  1. 0 0 * * * /bin/bash /var/ChinaUnix/AppServerBackup.sh
复制代码
第四题 答:
&& || 是控制操作符,分别代表AND和OR
command2 只有在 command1 返回 0 时才被执行。
command3 只有在 command1 返回非 0 时才被执行。
AND 和 OR 序列的返回状态是序列中最后执行的命令的返回状态。

if then else fi 结构是多路分支条件测试语句, 用来判断命令列表的退出状态码是否为0(0表示"成功", 如果成
功的话, 那么就执行接下来command2命令.如果不成功(退出状态码为非0),就执行else的command3
两者相比,使用控制操作符进行条件测试更为简洁,比较适合于简单的测试语句
if then else fi 结构则具有更好的扩展性能。

第五题:答:
方法1:
  1. echo 1234 | awk '{n=length;s=0;for(i=1;i<=n;i++){s+=substr($0,i,1)}print s}'
复制代码
方法2:
  1. a=1234 && for((i=0;i<${#a};i++));do ((s+=${a:$i:1}));done; echo ${s}
复制代码
第六题:答:
1. 首选在计算之前需要判断给的日期是否有效
   如果输入的日期无效或格式不正确则应该提示错误。
   如果输入的日期是有效日期则算出是这年的第几天。
# =========================  Start  =========================

  1. #!/bin/bash
  2. # Exp: sh caldate.sh 2013-05-23
  3. NormalYear_YearRex='([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})'
  4. NormalYear_MonthDayRex='((0[13578]|1[02])[-/](0[1-9]|[12][0-9]|3[01])|(0[469]|11)[-/](0[1-9]|[12][0-9]|30)|02[-/](0[1-9]|1[0-9]|2[0-8]))'
  5. LeapYear_YearRex='(([0-9]{2})(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[3579][26])00)'
  6. LeepYear_MonthDayRex='(02[-/]29)'       
  7. DateRex="^(${NormalYear_YearRex}[-/]${NormalYear_MonthDayRex}|${LeapYear_YearRex}[-/]${LeepYear_MonthDayRex})$"
  8. function calDateDays()
  9. {
  10.         echo "$*" | awk -F'[-/]' -v Rex="${DateRex}" --re-interval '
  11.                 {
  12.                     if($0~Rex)
  13.                     {
  14.                         tstamp=mktime($1" "$2" "$3" 00 00 00");
  15.                         print strftime("%j",tstamp);
  16.                     }
  17.                     else
  18.                     {
  19.                         print "invalid date: "$0;
  20.                     }
  21.                 }' | sed 's/^0//'
  22. }
  23. dt="$*"
  24. calDateDays ${dt}
复制代码
# =========================  END  =========================
2. 首选在计算之前需要判断给的日期是否有效
   如果输入的日期无效或格式不正确则应该提示错误。
   如果输入的日期是有效日期则算出是这年的第几天。
   时间偏移值可以是 [+-]Nday.
   + 代表未来的时间 - 代表之前的时间
   N 为任意整数均可
# =========================  Start  =========================

  1. #!/bin/bash
  2. # Exp: sh caldate.sh 2013-03-01 -1day
  3. YearRex='([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})'
  4. MonthDayRex='((0[13578]|1[02])[-/](0[1-9]|[12][0-9]|3[01])|(0[469]|11)[-/](0[1-9]|[12][0-9]|30)|02[-/](0[1-9]|1[0-9]|2[0-8]))'
  5. LeapYearRex='(([0-9]{2})(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[3579][26])00)'
  6. LeepMonthDayRex='(02[-/]29)'       
  7. DateRex="^(${YearRex}[-/]${MonthDayRex}|${LeapYearRex}[-/]${LeepMonthDayRex})$"

  8. function calDate()
  9. {
  10.         case "$2" in
  11.                 yesterday)      setDays='-1';;
  12.                 tomorrow)       setDays='+1';;
  13.                 [+-][0-9]*day)  setDays=${2/day/};;
  14.                 *)              echo "Offset Days Input Error!"
  15.                                 exit 1;;
  16.         esac

  17.         echo "$1" | awk -F'[-/]' -v Rex="${DateRex}" -v offset="${setDays}" --re-interval '
  18.                 {
  19.                         if($0~Rex)
  20.                         {
  21.                                 OFS=substr($0,5,1);
  22.                                 tstamp=mktime($1" "$2" "$3+offset" 00 00 00");
  23.                                 yyyy=strftime("%Y",tstamp);
  24.                                 mm=strftime("%m",tstamp);
  25.                                 dd=strftime("%d",tstamp);
  26.                                 print yyyy,mm,dd;
  27.                         }
  28.                         else
  29.                         {
  30.                                 print "invalid date: "$0
  31.                         }
  32.                 }'
  33. }
  34. dt="$1"
  35. offset="$2"
  36. calDate ${dt} ${offset}
复制代码
# =========================  END  =========================

第七题:答:
九宫格排列如下:
8 6 9
4 2 5  
7 3 1

8,2,1的位置固定不变;6与4、9与7、5与3 的位置可互换

解题思路:
1. 题目要求六个三位数都必须是奇数, 相加总和是 4446
   1-9当中, 奇数为 1 3 5 7 9 总和是25
            偶数为 2 4 6 8   总和是20
2. 由于总数4446的个位是6,且六个三位数都是奇数,而1-9当中只有5个奇数。总和为25(个位为5)
   要是总数的个位为6,则只有 5 + 1 = 6
   这样 第三行第三列就必定为1
   由于个位数全为奇数,故九宫格中除了第一行第一列、第一行第二列、第二行第一列、第二行第二列
   这四个交叉位 为偶数外,其余的 第一行第三列、第二行第三列 第三行第一列、第三行第二列、第三行第三列
   这五个交叉位都为奇数。除去第三行第三列已确定为1外。剩下的第一行第三列、第二行第三列 第三行第一列、第三行第二列
   有可能为3 5 7 9,
3. 通过分析总数4446是一个较大数。按照百位优先大数字的原则,我们把9与7放在百位。这样就会有1个900、1个700以上的数字
4. 由于在九宫格中存在3个交叉位的数数字会出现2次。偶数中有可能会是 2,4,6,8
   而2468 中8最大。故8应该放在 会出现2次的交叉位上,且为百位。那么 第一行第一列就非8莫属,这样就会有2个 800以上的数字
   而最小的偶数则放置在九方格最中间位置。
5. 最后进行计算。只要8,2,1的位置固定不变,6与4、9与7、5与3 的位置进行互换得出的总数均为4446.
   
第八题: 答:可以刪除!
bash中使用IFS(Internal Field Separator)这个变量用作shell指定的缺省域分隔符
原理上来说域分隔符可以为任意字符,但通常默认情况下IFS=" \n\t",即空格、新行、或tab键
rm指令中使用的"*"在這裡是作為一個通配符來使用,可以匹配包含空格的文件
所以"rm *"指令時可以刪除文件名包含空格的文件的。

第九题:不是很清楚,求指教!

第十题:
1.  列出当前目录下的非 20130605开头的文件
  1. ls | grep -v ^20130605
复制代码
2.

  1. #!/bin/bash
  2. # Exp sh prodiff.sh
  3. # 2. 将文件名中所有的空格, []去掉。
  4. for a in dirA/* dirB/*;do b="${a//[] []/}";[ "${a}" != "${b}" ] && mv "${a}" "${b}";done

  5. filesA=(`ls dirA | grep -E '.(che|XQF)`)
  6. for fileA in ${filesA[@]}
  7. do
  8.     filesB=(`ls dirB | grep -E '.(che|XQF)`)
  9.     for fileB in ${filesB[@]}
  10.     do
  11.         if [ "${fileA}" == "${fileB}" ]
  12.         then
  13.             # 3. 删除 dirA 下与 dirB 下重复的.che或.XQF文件
  14.             rm -f dirA/${fileA} dirB/${fileB}
  15.         else
  16.             # 4. 删除.XQF对应的.che文件
  17.             if [ ".${fileA##*.}" == ".XQF" ]
  18.             then
  19.                 a1=`echo ${filesA[@]}| xargs -n1 | grep ${fileA%%.*}.che`
  20.                 [ -n "${a1}" ] && rm -f dirA/${a1}
  21.                 b1=`echo ${filesB[@]}| xargs -n1 | grep ${fileA%%.*}.che`
  22.                 [ -n "${b1}" ] && rm -f dirB/${b1}
  23.             fi
  24.             
  25.             if [ "$.{fileB##*.}" == ".XQF" ]
  26.             then
  27.                 b2=`echo ${filesB[@]}| xargs -n1  | grep ${fileB%%.*}.che`
  28.                 [ -n "${b2}" ] && rm -f dirB/${b2}
  29.                 a2=`echo ${filesA[@]}| xargs -n1  | grep ${fileB%%.*}.che`
  30.                 [ -n "${a2}" ] && rm -f dirA/${a2}
  31.             fi
  32.         fi
  33.     done
  34. done
复制代码

作者: send_linux    时间: 2013-06-26 15:30
helpid 发表于 2013-06-26 15:25
第一题: 使用awk可以快速的统计出TOP10的IP地址以及数量
方法1:方法2:第二题: 个人分析:
这个问题关 ...


感谢参与~
作者: luyanfei78    时间: 2013-06-26 20:50
第二题:
  1. #!/bin/bash
  2. #该脚本第一次运行时只会去搜寻前1024字节的内容中有没有<Error>,
  3. #在后续运行过程中才能正确监测前10分钟以内的错误信息。

  4. file=$1
  5. if [ -z "$file" -o ! -f "$file" ]
  6. then
  7.     echo "You must provide logfile."
  8.     exit 1
  9. fi

  10. #基本思路:
  11. #1.用一个隐藏文件存放上一次统计时日志文件的容量。
  12. #2.每次用tail取出新增加容量大小的文本进行处理。

  13. #ADJUST_SIZE用于校准容量计算上可能出现的偏差
  14. ADJUST_SIZE=1024
  15. TEN_MINUTES=600

  16. dir=$(dirname $file)
  17. base=$(basename $file)
  18. #隐藏文件名,wls_ms1.out文件对应的隐藏文件名为.wls_ms1.out.size
  19. sizefile="${dir}/.${base}.size"
  20. #echo "sizefile=$sizefile"

  21. #如果该文件还不存在,则创建该文件。
  22. if [ ! -s $sizefile ]
  23. then
  24.     du -b $file | cut -f 1 > $sizefile
  25. fi

  26. oldsize=$(cat $sizefile)
  27. newsize=$(du -b $file | cut -f 1)
  28. tailsize=$(($newsize - $oldsize + $ADJUST_SIZE))
  29. #echo "oldsize=$oldsize,newsize=$newsize,tailsize=$tailsize"

  30. #记录开始搜索之前的时间
  31. current_time=$(date '+%s')
  32. ten_minutes_ago=$(($current_time - $TEN_MINUTES))
  33. errors=$(tail -c $tailsize $file | grep '<Error>')
  34. if [ -z "$errors" ]
  35. then
  36.     exit 0
  37. fi

  38. #存放邮件的临时文件
  39. msg=$(mktemp)
  40. echo $errors | while read
  41. do
  42.     entry_time=$(echo $REPLY | sed 's/^<\([^>]\+\)>.*/\1/')
  43.     t=$(date -d "$entry_time" "+%s")
  44.     if [ "$t" -gt "$ten_minutes_ago" -a "$t" -le "$current_time" ]
  45.     then
  46.          echo "$REPLY" >> $msg
  47.     fi
  48. done
  49. if [ -s "$msg" ]
  50. then
  51.     cat $msg | mail -s "Got <Error>" admin@ChinaUnix.net
  52. fi

  53. #删除临时文件
  54. [ -f "$msg" ] && rm -f $msg
复制代码

作者: raindove    时间: 2013-06-27 09:53
第一题 命令
cut -f 5- illegal.log | sort | uniq -c | sort -r | head -n 10 > result.txt
作者: luyanfei78    时间: 2013-06-27 10:47
本帖最后由 luyanfei78 于 2013-06-27 11:23 编辑

第三题:
  1. # cat excludes.list
  2. bin/*
  3. logs/*
  4. *.log
  5. *heapdump*
  6. *.gz
  7. *.tar
  8. *.zip
  9. *.bak
  10. excludes.list
复制代码
  1. #!/bin/bash
  2. #本脚本使用了GNU tar的增量备份功能,运行时需要保证远程主机上安装的是GNU tar。

  3. LOCAL=/var/ChinaUnix
  4. REMOTE=/opt/WebSphere/AppServer/profiles

  5. for num in $(seq -s' ' 3 100)
  6. do
  7.     host=192.168.1.${num}
  8.     echo "Connecting $host ..."
  9.     echo "Distributing excludes.list file to $host."
  10.     cat $LOCAL/excludes.list | ssh $host "cat > ${REMOTE}/excludes.list"
  11.     #如果是星期天,那么删除远程主机上的list.snap文件,这样产生的备份会是全备份。
  12.     [ $(date "+%u") -eq 7 ] && ssh $host "rm -f ${REMOTE}/list.snap"
  13.     #执行备份
  14.     echo "Now begin backup, please wait ..."
  15.     ssh $host "tar -C $REMOTE -c -z -g ${REMOTE}/list.snap ." > $LOCAL/backup.$(date "+%F").tar.gz
  16.     echo "Backup ended."
  17. done
复制代码

作者: zzfzqq    时间: 2013-06-27 10:50
本帖最后由 zzfzqq 于 2013-06-27 10:50 编辑

系统环境:centos 6.3
第五题 脚本:
注释:利用shell数组来计算任意多位数的各位相加之和。第一个for循环将多位数转为数组存储,第二个for循环则取出数组的值加以计算最后得到结果。
#!/bin/bash
echo "Please enter any digits:"
read num
length=`expr length $num`
for i in `seq 1 $length`
do
        a[$i]=`echo "$num" |cut -c "$i"`
done
sum=0
for  j  in  `seq 1 $length`
do
        sum=`echo $((${a[$j]}+$sum))`
done
echo "Sum: $sum"

作者: luyanfei78    时间: 2013-06-27 10:54
第四题:
两种写法在逻辑上是等价的。不过第一种写法(command1 && command2 || command3)中的命令不能太过复杂,如果里面再使用管道,会让这种写法变得非常难以阅读。因此第一种写法只适合命令相对很简单的情形。
第五题:
  1. echo $(($(echo -n '1234' | sed 's/\([0-9]\)/\1+/g') 0))
复制代码
把里面的数字换掉也能计算出结果。
作者: personball    时间: 2013-06-27 16:05

来晚了,捧捧场
第一题
  1. personball@ubuntu:~/Downloads$ awk '{a[$6]++}END{for(i in a)print i" "a[i]}' illegal.log |sort -rnk2|head
  2. 220.250.52.66 70
  3. 220.250.58.170 36
  4. 220.250.58.171 30
  5. 220.250.52.90 29
  6. 220.250.58.172 28
  7. 142.4.117.83 27
  8. 111.73.45.13 23
  9. 222.186.26.26 22
  10. 74.91.23.27 19
  11. 91.237.249.67 16
  12. personball@ubuntu:~/Downloads$
复制代码

作者: WilliBhamlll    时间: 2013-06-27 17:15
这个贴子的访问量增加得真快




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2