免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
1
2015七夕节徽章
日期:2015-08-21 17:58:43
81 [报告]
发表于 2013-06-25 17:12 |只看该作者
第四题:
前者,只有当command1和command2都没有执行成功时才会执行command3
后者,当command1没有成功时执行command3

论坛徽章:
1
2015七夕节徽章
日期:2015-08-21 17:58:43
82 [报告]
发表于 2013-06-25 17:28 |只看该作者
第八题:可以

论坛徽章:
1
2015七夕节徽章
日期:2015-08-21 17:58:43
83 [报告]
发表于 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

论坛徽章:
3
射手座
日期:2013-10-12 12:01:59技术图书徽章
日期:2014-03-06 15:32:30技术图书徽章
日期:2014-03-06 15:42:47
84 [报告]
发表于 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地址:登录失败次数

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

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

论坛徽章:
1
2015七夕节徽章
日期:2015-08-21 17:58:43
87 [报告]
发表于 2013-06-26 09:05 |只看该作者
第七题:
8 6 7
4 2 3
9 5 1

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

厉害,都答完了,恭喜。。。。

论坛徽章:
1
午马
日期:2013-09-01 15:14:32
89 [报告]
发表于 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

论坛徽章:
3
射手座
日期:2013-10-12 12:01:59技术图书徽章
日期:2014-03-06 15:32:30技术图书徽章
日期:2014-03-06 15:42:47
90 [报告]
发表于 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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP