免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
31 [报告]
发表于 2013-06-19 00:41 |只看该作者
第四题
当command1成功,command2失败的情况下,第一个会执行command1;command2;command3,
而第二个只会执行command1;command2

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
32 [报告]
发表于 2013-06-19 00:43 |只看该作者
第五题
  1. echo "1234" | awk 'BEGIN{FS=""}{for(i=1;i<=NF;++i)a+=$i; print a}'
复制代码

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
33 [报告]
发表于 2013-06-19 00:46 |只看该作者
第八题
可以,因为单词拆分在文件名扩展之前进行

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
34 [报告]
发表于 2013-06-19 00:48 |只看该作者
第九题
  1. TEST=*;ls $TEST
复制代码

论坛徽章:
8
双子座
日期:2013-08-31 07:37:12金牛座
日期:2013-09-09 18:49:12处女座
日期:2013-09-23 11:43:14处女座
日期:2013-10-09 19:48:21狮子座
日期:2014-03-24 18:22:12丑牛
日期:2014-04-22 22:07:51申猴
日期:2014-06-12 21:54:13双鱼座
日期:2014-06-13 21:52:31
35 [报告]
发表于 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.        
复制代码

论坛徽章:
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
36 [报告]
发表于 2013-06-19 07:36 |只看该作者
kernel69 发表于 2013-06-19 01:31


谢谢参与!

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

论坛徽章:
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
38 [报告]
发表于 2013-06-19 09:18 |只看该作者
永夜之魂 发表于 2013-06-19 08:04
1.2.这里先说一下个人的看法,因为日志超过1G,因此假定,每一分钟都在写入log,这里参照本番环境的log来处 ...


谢谢参与!

论坛徽章:
0
39 [报告]
发表于 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

论坛徽章:
13
丑牛
日期:2013-08-16 15:08:22技术图书徽章
日期:2013-11-26 10:13:40双鱼座
日期:2013-11-08 15:03:26戌狗
日期:2013-11-08 13:52:30技术图书徽章
日期:2013-11-05 14:06:30戌狗
日期:2013-10-31 11:45:42CU十二周年纪念徽章
日期:2013-10-24 15:41:34天秤座
日期:2013-10-11 14:55:08子鼠
日期:2013-09-26 19:36:35水瓶座
日期:2013-09-26 17:44:56午马
日期:2013-08-26 10:24:23丑牛
日期:2013-08-19 14:43:22
40 [报告]
发表于 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
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP