在门户网站做推广,网站开发需要20万,免费找人网站 优帮云,如何免费域名标签#xff1a;面试题 shell 正则表达式 开发 sed 原创作品#xff0c;允许转载#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://president.blog.51cto.com/4990508/854249由于工作的关系#xff0c;收集了很多的s… 标签面试题 shell 正则表达式 开发 sed 原创作品允许转载转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://president.blog.51cto.com/4990508/854249 由于工作的关系收集了很多的shell面试题有些比较有意思有些纯粹是为折磨人用的题目。有的看完会心一笑有的看了之后会以为是几年前开发的面试题。不知道是会的人多了还是有意的为难想起一句话庙小妖风大水浅那个啥多。 多说一句解决的方法有很多种也许这里给出的答案并不是最优的但应该是比较容易解释容易理解的。具体是什么公司的面试题就不说了毕竟是人家的隐私。 这篇的内容相对基础主要集中在计划任务和find命令上面。 crontab 分时日月周 find命令的 exec 和 xargs 这是两个比较容易遗忘的知识点。 1、编写shell程序实现自动删除50个账号的功能。账号名为stud1至stud50。 一句话思路找出规律循环解决 for((i1;i51;i));do userdel -r stud$i ;done 知识点for循环当然是用while循环也是可以的until也行。 2、某系统管理员需每天做一定的重复工作请按照下列要求编制一个解决方案 1在下午4 :50删除/abc目录下的全部子目录和全部文件 2从早8:00下午6:00每小时读取/xyz目录下x1文件中每行第一个域的全部数据加入到/backup目录下的bak01.txt文件内 3每逢星期一下午5:50将/data目录下的所有目录和文件归档并压缩为文件backup.tar.gz 一句话思路主要考验管理员对于计划任务的熟悉程度 crontab -e 50 16 * * * rm -rf /abc/* * 8-18/1 * * * awk {print $1 /backup/bak01.txt} /xyz/x1 50 17 * * 1 tar -czf backup.tar.gz /data 知识点awk的输出重定向当然用管道也是可以的。tar命令打包参数这样做会有一个提示只是去掉了目录不用理会。 3、gameser这个服务启动命令为./gameser服务请写一个脚本当服务宕掉脚本自动拉起gameser服务。 一句话思路进程管理 #!/bin/bash while true;do resultps aux | grep gameser | wc -l if [ $result -lt 2 ];then ./gameser; fi sleep 5 done 知识点还可以使用pgrep命令。 4、linux crontab请在3月23号21点18分的时候重启服务器 一句话思路计划任务关机 crontab -e 18 21 23 3 * init 6 知识点可能会延展提问到最安全的关机命令“写缓存”sync 最好两遍有人说三遍其实四遍也行要不干脆还是别关机了 5、你想每天23:00运行xxxx.sh脚本。并自动进行日志分析。第2天上班的时候看到分析结果 给出你的部属方案 一句话思路计划任务日志分析 0 23 * * * sh ****.sh;err$?;logger -p cron.err $err 知识点第一个参数一定要写零否则在定义的23点里每分钟都会执行。计划任务只有当报错的时候才会以邮件形式发送给用户所以这里使用logger命令将消息发送给日志服务器这里只是发送了命令返回值你可以随意发送内容看你喜欢了。 6、要求运行脚本输入两个数得到如下结果 #sh xxx.sh 2 3 ** *** ***** 一句话思路看到这个第一反应就是循环呗。 #!/bin/bash line1$1 line2$2 let line3$1$2 while [ $line1 -gt 0 ];do echo -n \* let line1$line1-1 done echo while [ $line2 -gt 0 ];do echo -n \* let line2$line2-1 done echo while [ $line3 -gt 0 ];do echo -n \* let line3$line3-1 done echo 知识点如果你的第一反应是使用循环那就进入一个死循环了因为根本就没有规律。我们都知道循环是依靠一定规律的。echo 的 -n参数。*在shell中是通配符所以要加转义字符。希望你能给出更好的解决方案 9、查找文件后缀是log的 三天前的文件删除 一句话思路查找就一定是find find / -name *.log -and -mtime 3 -exec rm -rf {} \; 知识点-mtime 代表后面数字之外的- 就是之内的。 10、写一个脚本将目录下大于100kb的文件移动到/tmp下 一句话思路同上 find ./ -size 100k -exec mv {} /tmp \; 知识点-exec {} \; 标准写法没有好办法背吧。 11 、日志如下统计访问IP最多的前10个 192.168.0.6 - - [25/Nov/2010:13:55:10 0800] GET /cacti/p_w_picpaths/auth_login.gif HTTP/1.1 200 21265 http://192.168.0.104/cacti/graph_view.php?actiontreetree_id2leaf_id8page3 Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1) 192.168.0.6 - - [25/Nov/2010:13:55:14 0800] GET /favicon.ico HTTP/1.1 404 287 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1) 这个题在前一篇中已经给出答案这里就不再赘述。 http://7648853.blog.51cto.com/4990508/851407 12、过滤出当前目录下所有以字母不区分大小写开头的文件 一句话思路过滤就是grep ls | grep -P ^[a-zA-Z] ls | grep -P -i ^[a-z] 知识点正则表达式使用-i参数让grep命令不区分大小写。 13、文件A.txt内容为12:34:68只输出A.txt中的34 一句话思路提取内容就是awk awk -F : {print $2} A.txt 知识点awk 域-F参数指定分隔符默认分隔符是空格。 14、用sed命令实现直接将文件B.TXT中的所有123替换成345 一句话思路没思路了人家都说了用sed sed -i s/123/456/g B.TXT 知识点-i参数让sed修改文件默认不修改源文件。题目中提到了所有字样所以要使用g参数。 15、用sed修改文件mailbox.txt的20行的zhango为wang 一句话思路命题作文sed没有瞎想空间 sed -i 20s/zhango/wang/ mailbox.txt 知识点上题是全局这题规定了行。如果写成这样/20/就是正则表达式了。 16、正则表达式IP地址的匹配写一下 一句话思路遥想当年web开发程序员面试不出意外的第一道题。 ([0-9]{1,3}\.){1,3}([0-9]){1,3} 知识点正则表达式写个简单的,这个答案不严谨但考虑到只是面试所以将就将就也能用。 17、写出命令。统计日志文件weblog.log中 今天14:00~15:00的记录条数(时间格式2011-01-01—15:30:11) 一句话思路第一反应这个要用awk分析统计嘛。可真要用awk麻烦就大了。 sum14grep -c 2011-01-01-14 weblog.log sum15grep -c 2011-01-01-15 weblog.log echo $[$sum14$sum15] 知识点grep命令-c参数统计匹配的行数。shell中的数学计算。 18、求一组数的最大值和最小值 一句话思路运维越来越像开发了冒泡法都有了。越来越难混了一个运维不看手册要看算法了。 知识点去看书吧看算法的。 19、将当前目录所有文件扩展名改为log 一句话思路如果你的第一反应是使用find命令那么恭喜你你中了敌人的奸计不是不能实现是很麻烦。 for file in ls ./ | grep -P (.*)(\..*);do echo $file | mv $file sed -r s#(.*)(\..*)#\1.log#; done for file in ls ./ | grep -P (.*)(\..*);do echo $file | mv $file echo ${file%.**}.log; done 知识点第一个方法中使用了sed第二个方法中使用了字符操作#从前向后数%从后向前数。其实说白了就是为了拼凑出 mv 参数1 参数2。其实很多时候编写shell脚本的时候要学会反向推导逆向思考。 还有一种方法是使用cut命令但如果遇到文件有两个扩展名的情况下就会出现问题。redhat as4 安装完成后在root目录下会生成install.log install.log.syslog这两个文件如果使用cut就会出现错误。具体原因在这里就不说了。运维嘛需要的是严谨 20、用shell在/usr/local下 建立20个子目录 xunlei1-xunlei20,再在这个子目录下分别建255个子目录dir1-dir255,再在255个子目录下创建10000个文件xunlei1.html-xunlei10000.html 一句话思路这有啥{}大括号呗。 mkdir -p /usr/loca/xunlie{1..20}/dir{1..255}/ touch /usr/loca/xunlie{1..20}/dir{1..255}/xunlei{1..10000}.html 知识点如果你就这么写上去那你又中计了。为什么呢因为超过了shell命令参数的最大限制。shell中参数的限制是5452。所以要分着写。 写到这里不禁感叹面试这件事情越来越难。本来面试就紧张满怀期待不仅要跟HR讨价还价还要与技术主管斗智斗勇好吧人是活的我们忍了。可连死的面试题都要处处小心。可话说回来面试题做不出来就算你跟诸葛亮对着骂街都能微操胜券也没用。 在这里要特别感谢邰锴同学这些shell题是他帮忙汇总整理出来的。 本文出自 “林肯” 博客请务必保留此出处http://president.blog.51cto.com/4990508/854249 转载于:https://blog.51cto.com/1158497363/1088509