linux-shell面试题 之二
标签:面试题 shell 正则表达式 开发 sed
多说一句,解决的方法有很多种,也许这里给出的答案并不是最优的,但应该是比较容易解释,容易理解的。具体是什么公司的面试题就不说了,毕竟是人家的隐私。
crontab 分时日月周 find命令的 exec 和 xargs 这是两个比较容易遗忘的知识点。
一句话思路:找出规律,循环解决
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面试题 之二相关推荐
- 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 ...
- Linux Shell常用技巧(十二) Shell编程
二十三. Bash Shell编程: 1. 读取用户变量: read命令是用于从终端或者文件中读取输入的内建命令,read命令读取整行输入,每行末尾的换行符不被读入.在read命令后面,如 ...
- Linux Shell常用技巧(十二)
二十三. Bash Shell编程: 1. 读取用户变量: read命令是用于从终端或者文件中读取输入的内建命令,read命令读取整行输入,每行末尾的换行符不被读入.在read命令后面,如 ...
- linux shell学习笔记(二) 变量和运算符
1.什么是shell变量?本地变量.环境变量.变量替换(显示变量).位置变量.标准变量.特殊变量.影响变量的命令 2.本地变量:本地变量在用户现在的shell生命期的脚本中使用 variable-na ...
- linux读取环境变量替换,linux Shell脚本学习笔记二(变量和环境变量)
2.变量和环境变量 使用env命令在终端中查看所有与此终端进程相关的环境变量.对于每个进程,在起运行时的环境变量可以使用下面的命令来查看: cat /proc/$PID/environ 其中,将PID ...
- linux shell面试题(一)
统计文件得行数 题目描述: 写一个 bash脚本以输出一个文本文件 nowcoder.txt中的行数 cat nowcoder.txt | wc -l 打印文件的最后5行 题目描述: 经常查看日志的时 ...
- Linux Shell常用技巧(目录)
Linux Shell常用技巧(一) http://liuxuyang.blog.51cto.com/2546552/1289413 一. 特殊文件: /dev/null和/dev/tty 二. 简单 ...
- 【shell 大系】Linux Shell常用技巧
在最近的日常工作中由于经常会和Linux服务器打交道,如Oracle性能优化.我们数据采集服务器的资源利用率监控,以及Debug服务器代码并解决其效率和稳定性等问题.因此这段时间总结的有关Linux ...
- 【转】十分有用的linux shell学习总结
在最近的日常工作中由于经常会和Linux服务器打交道,如Oracle性能优化.我们 数据采集服务器的资源利用率监控,以及Debug服务器代码并解决其效率和稳定性等问题.因此这段时间总结的有关Linux ...
- linux脚本简介,Linux Shell脚本简介
Shell 诞生于 Unix,是与 Unix/Linux 交互的工具,单独地学习 Shell 是没有意义的,请先参考Unix/Linux入门教程,了解 Unix/Lunix 基础. 近几年来,Shel ...
最新文章
- java中system.out.println()是什么意思【笔记自用】
- windows环境wampserver3 切换 php7
- C语言的三种基本程序结构是什么
- mysql的命令行常用命令_mysql命令行常用命令
- JAVA8的新特性之Stream
- 为什么K8s会成为主流?
- 4.3.8 使用模板
- onenote使用python开发_如何充分利用 OneNote,发挥它的全部价值和潜力?
- 根据身份证号得到籍贯、性别、出生日期、验证身份证号
- 寻找隐藏在CloudFlare和Tor后的真实IP
- 网站建设教程:如何自己做网站,步骤有哪些?
- 电脑开机自检怎么取消
- JDBCDataSource
- [学渣版]英语四、六级救急小套路总结
- 解密产品经理兼职做猎头,3个月赚十万
- 国际禁毒日 | 和TcaplusDB向毒品说不!
- CHROME扩展笔记之设置代理(项目完成再上完整案例)
- 你有一条微信未发送_微信支持发送大文件;男子薅90年爱奇艺VIP;京东方再次未通过苹果质量审查...
- X200显卡驱动 花屏问题 解决方法
- Python调用MMDetection实现AI抠图去背景