免费注册 查看新帖 |

Chinaunix

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

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

cd_chair 该用户已被删除
71 [报告]
发表于 2013-06-22 21:28 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
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
72 [报告]
发表于 2013-06-23 20:41 |只看该作者
cd_chair 发表于 2013-06-22 21:28
作为SHELL版游客也有两年多了,水平也就那样。从没回过贴,这次只挑了自己觉得会的,版主及各位大牛见笑了
...



潜水两年了,谢谢兄弟给面子哈,参与这次活动了,呵呵

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

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

论坛徽章:
0
75 [报告]
发表于 2013-06-24 14:22 |只看该作者
[第4题]:
先看第二个if--esle的表达式,该表达是只用判断if后面的表达式,决定接下来执行哪一个分支。
第一个表达式,同样是先判断第一个表达式,不同的是,如果决定执行第二个表达式的话,还会判断第二个表达式,决定是否执行第三个表达式。

论坛徽章:
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
76 [报告]
发表于 2013-06-24 19:05 |只看该作者
dc222222222 发表于 2013-06-24 14:22
[第4题]:
先看第二个if--esle的表达式,该表达是只用判断if后面的表达式,决定接下来执行哪一个分支。
第 ...


欢迎参与!

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
77 [报告]
发表于 2013-06-25 14:18 |只看该作者
同一个目录可能存在两个文件名相同的文件么?别告诉我后缀名不算文件名的一部分~

论坛徽章:
0
78 [报告]
发表于 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、想到的方法就是集合循环处理了。





   

论坛徽章:
1
子鼠
日期:2013-08-23 16:36:37
79 [报告]
发表于 2013-06-25 17:04 |只看该作者
支持   同志们加油了

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

grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' illegal.log |uniq -c|sort -nr
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP