标签:面试题 shell 正则表达式 开发 sed

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://president.blog.51cto.com/4990508/854249
由于工作的关系,收集了很多的shell面试题,有些比较有意思,有些纯粹是为折磨人用的题目。有的看完会心一笑,有的看了之后会以为是几年前开发的面试题。不知道是会的人多了,还是有意的为难,想起一句话,庙小妖风大,水浅那个啥多。 
      多说一句,解决的方法有很多种,也许这里给出的答案并不是最优的,但应该是比较容易解释,容易理解的。具体是什么公司的面试题就不说了,毕竟是人家的隐私。
这篇的内容相对基础,主要集中在计划任务和find命令上面。
       crontab 分时日月周 find命令的 exec 和 xargs 这是两个比较容易遗忘的知识点。
 
1、编写shell程序,实现自动删除50个账号的功能。账号名为stud1至stud50。
     一句话思路:找出规律,循环解决
     for((i=1;i<51;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

result=`ps 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?action=tree&tree_id=2&leaf_id=8&page=3" "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麻烦就大了。
  
    sum14=`grep -c "2011-01-01-14" weblog.log`
    sum15=`grep -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

linux-shell面试题 之二相关推荐

  1. Linux | Shell 学习笔记(二)Shell 流程控制 if、case、for、while| read读取输入 | 函数的使用 | cut、sed、awk、sort命令 +Demo

    文章目录 参考资料 运行环境 一.流程控制 1.1 if 判断 1.2 case 语句 1.3 for 循环 1.4 while 循环 二. read 读取控制台输入 三.函数 3.1 系统函数 ba ...

  2. Linux Shell常用技巧(十二) Shell编程

    二十三. Bash Shell编程:  1.  读取用户变量:     read命令是用于从终端或者文件中读取输入的内建命令,read命令读取整行输入,每行末尾的换行符不被读入.在read命令后面,如 ...

  3. Linux Shell常用技巧(十二)

    二十三. Bash Shell编程:  1.  读取用户变量:     read命令是用于从终端或者文件中读取输入的内建命令,read命令读取整行输入,每行末尾的换行符不被读入.在read命令后面,如 ...

  4. linux shell学习笔记(二) 变量和运算符

    1.什么是shell变量?本地变量.环境变量.变量替换(显示变量).位置变量.标准变量.特殊变量.影响变量的命令 2.本地变量:本地变量在用户现在的shell生命期的脚本中使用 variable-na ...

  5. linux读取环境变量替换,linux Shell脚本学习笔记二(变量和环境变量)

    2.变量和环境变量 使用env命令在终端中查看所有与此终端进程相关的环境变量.对于每个进程,在起运行时的环境变量可以使用下面的命令来查看: cat /proc/$PID/environ 其中,将PID ...

  6. linux shell面试题(一)

    统计文件得行数 题目描述: 写一个 bash脚本以输出一个文本文件 nowcoder.txt中的行数 cat nowcoder.txt | wc -l 打印文件的最后5行 题目描述: 经常查看日志的时 ...

  7. Linux Shell常用技巧(目录)

    Linux Shell常用技巧(一) http://liuxuyang.blog.51cto.com/2546552/1289413 一. 特殊文件: /dev/null和/dev/tty 二. 简单 ...

  8. 【shell 大系】Linux Shell常用技巧

    在最近的日常工作中由于经常会和Linux服务器打交道,如Oracle性能优化.我们数据采集服务器的资源利用率监控,以及Debug服务器代码并解决其效率和稳定性等问题.因此这段时间总结的有关Linux ...

  9. 【转】十分有用的linux shell学习总结

    在最近的日常工作中由于经常会和Linux服务器打交道,如Oracle性能优化.我们 数据采集服务器的资源利用率监控,以及Debug服务器代码并解决其效率和稳定性等问题.因此这段时间总结的有关Linux ...

  10. linux脚本简介,Linux Shell脚本简介

    Shell 诞生于 Unix,是与 Unix/Linux 交互的工具,单独地学习 Shell 是没有意义的,请先参考Unix/Linux入门教程,了解 Unix/Lunix 基础. 近几年来,Shel ...

最新文章

  1. java中system.out.println()是什么意思【笔记自用】
  2. windows环境wampserver3 切换 php7
  3. C语言的三种基本程序结构是什么
  4. mysql的命令行常用命令_mysql命令行常用命令
  5. JAVA8的新特性之Stream
  6. 为什么K8s会成为主流?
  7. 4.3.8 使用模板
  8. onenote使用python开发_如何充分利用 OneNote,发挥它的全部价值和潜力?
  9. 根据身份证号得到籍贯、性别、出生日期、验证身份证号
  10. 寻找隐藏在CloudFlare和Tor后的真实IP
  11. 网站建设教程:如何自己做网站,步骤有哪些?
  12. 电脑开机自检怎么取消
  13. JDBCDataSource
  14. [学渣版]英语四、六级救急小套路总结
  15. 解密产品经理兼职做猎头,3个月赚十万
  16. 国际禁毒日 | 和TcaplusDB向毒品说不!
  17. CHROME扩展笔记之设置代理(项目完成再上完整案例)
  18. 你有一条微信未发送_微信支持发送大文件;男子薅90年爱奇艺VIP;京东方再次未通过苹果质量审查...
  19. X200显卡驱动 花屏问题 解决方法
  20. Python调用MMDetection实现AI抠图去背景

热门文章

  1. 【计算机网络】数据链路相关技术
  2. 运算符面试题(剑指offer,面试宝典,牛客网)
  3. 括号匹配问题(c和c++版本实现)
  4. leetcode(二)二分法查找算法
  5. 【Leetcode | 03】String
  6. .net Core把一个list集合里面的所有字段的数值汇总
  7. 万恶之源 - Python数据类型二
  8. PyCharm之python书写规范--消去提示波浪线
  9. 踩坑 net core
  10. iOS https双向配置