免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: send_linux

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

论坛徽章:
0
发表于 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

论坛徽章:
50
15-16赛季CBA联赛之广夏
日期:2018-11-05 09:42:462015年亚冠纪念徽章
日期:2015-07-23 11:58:122015亚冠之广州富力
日期:2015-07-07 08:26:172015亚冠之塔什干棉农
日期:2015-06-29 09:08:072015年亚洲杯之伊朗
日期:2015-03-08 20:51:012015年迎新春徽章
日期:2015-03-04 09:58:11未羊
日期:2014-10-16 22:41:47处女座
日期:2014-10-16 15:33:33酉鸡
日期:2014-03-13 12:54:10巳蛇
日期:2014-03-10 14:39:052015亚冠之德黑兰石油
日期:2015-07-29 12:46:372015亚冠之德黑兰石油
日期:2015-08-07 12:54:11
发表于 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
复制代码

论坛徽章:
1
辰龙
日期:2014-05-22 11:38:58
发表于 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
复制代码

论坛徽章:
0
发表于 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
复制代码

论坛徽章:
0
发表于 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

论坛徽章:
0
发表于 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; }'

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2013-06-18 22:25 |显示全部楼层
好活动,支持!

论坛徽章:
0
发表于 2013-06-18 23:20 |显示全部楼层
-_-! 连学习的机会也没有了吗?
都隐藏了

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
发表于 2013-06-18 23:27 |显示全部楼层
jihaiming 发表于 2013-06-18 23:20
-_-! 连学习的机会也没有了吗?
都隐藏了


等比赛结果公布后,则自然会打开的,不好意思哈

论坛徽章:
1
午马
日期:2013-09-01 15:14:32
发表于 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
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP